我有一个用户在某处拖动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
}
}
这很有效,并且递归深度似乎不是问题 - 我的拖动轨迹通常只有几百个点。 (我假设递归调用回溯获得尾调用优化的机会相当渺茫?)。但我仍然想知道:这是我正在努力实现的合理/正常/安全解决方案吗?或者是否有更简单的方法将时间戳和状态的集合传递给动画并说“播放这些”?
答案 0 :(得分:0)
你没有导致递归。由于完成块是异步调用的,因此它不会深入到函数堆栈中。您可以通过在那里设置断点并检查堆栈跟踪来自己查看
您可以想象NSTimer
在理论上触发无限次并且不会导致递归。
对于第二个问题,你可以制作这样的动画。它被称为CAKeyframeAnimation
,它是QuartzCore
框架的一部分。它需要您使用图层而不是视图,但 不是很难。
只需对您的代码注释一下:尝试使用选项UIViewAnimationOptionCurveLinear
让动画更加流畅。