1

我有一个场景,用户将 UIView 拖到某个地方;我想将它返回到它开始的位置,并且我希望它沿着相同的轨道以用户拖动的相同速度返回。我想出了一个递归解决方案,如下所示:

@property (...) NSMutableArray *dragTrack; // recorded during pan gesture

- (void)goHome
{
        [self backtrack: [self.dragTrack count] 
                         withDelay: 1.0 / [self.dragTrack count]];  
                 // interim version of delay; will implement accurate timing later
}

- (void)backtrack: (int)idx withDelay: (double)delay
{
    if (idx > 0){
        [UIView animateWithDuration:0 delay:delay options: 0
        animations: ^{
            self.center = [[self.dragTrack objectAtIndex:idx - 1] CGPointValue];
        }
        completion:^(BOOL finished){
            [self backtrack: idx - 1 withDelay: delay];
        }];
    } else {
        // do cleanup stuff
    }
}

这行得通,递归深度似乎不是问题——我的拖曳轨迹通常只有几百点长。(我假设递归调用回溯优化尾调用的机会相当渺茫?)。但我仍然想知道:对于我想要实现的目标,这是一个合理/正常/安全的解决方案吗?或者有没有更简单的方法将时间戳和状态的集合传递给动画并说“播放这些”?

4

1 回答 1

0

没有在那里引起递归。由于完成块是异步调用的,它并没有深入到函数堆栈中。您可以通过在此处设置断点并检查堆栈跟踪来自己查看。
您可以想象NSTimer那里触发理论上无限次并且不会导致递归。

对于你的第二个问题,你可以制作这样的动画。它被调用CAKeyframeAnimation并且它是QuartzCore框架的一部分。它需要您使用图层而不是视图,但这并不

请注意您的代码:尝试使用选项UIViewAnimationOptionCurveLinear使动画更流畅。

于 2013-01-28T21:24:13.283 回答