2012-07-26 79 views
1

我有一个用户在某处拖动UIView的场景;我想将它返回到它开始的位置,并且我希望它沿着相同的轨道返回,并且速度与用户拖动的速度相同。我想出了一个递归解决方案,看起来像这样: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 
    } 
} 

这工作,和递归深度似乎并不成为一个问题 - 我拖轨道通常只有几百几个百分点长。 (我假设递归调用回调获得tail调用优化的机会相当渺茫?)。但我仍然想知道:这是一个合理的/正常的/安全的解决方案,我试图达到什么目的?还是有更简单的方法将时间戳和状态集合传递给动画并说“播放这些”?

回答

0

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

对于第二个问题,您可以制作这样的动画。它被称为CAKeyframeAnimation,它是QuartzCore框架的一部分。它会要求你使用图层而不是视图,但它不是困难。

只需要注意一下你的代码:尝试使用选项UIViewAnimationOptionCurveLinear使动画更加流畅。