【问题标题】:IOS: Delayed animationIOS:延迟动画
【发布时间】:2026-01-28 10:40:01
【问题描述】:

我想知道最好的方法是:

你有这个功能:

- (void)launchAirplane:(int)whichAirplane {

 // Add score lables 
 // Start particle effect
 // Move airplane (whichAirplane)
 // Remove airplan 
}

您有 10 架飞机,它们彼此相邻。每架飞机应该在前一架飞机之后延迟 0.1 秒发射。所以飞机 1 在 0 秒后发射,飞机 2 在 0.1 秒后发射,飞机 3 在 0.2 秒后发射,等等。

所以有几种方法可以做到这一点:

  1. 将 GCD 与 dispatch_after 一起使用(但 dispatch_after 非常不准确,我注意到 0.1 秒的延迟可能相差高达 30 %)。
  2. NSTimer
  3. CADiplay 链接。

【问题讨论】:

  • 我想你回答了你自己的问题。如果使用得当且简单,NSTimer 是可靠的。在发送第 10 架飞机后停止计时器。 *.com/questions/8172473/…
  • 在延迟后使用 performSelector 怎么样?

标签: ios objective-c


【解决方案1】:

我会这样做:

NSArray *airplanes = ... // here you are initializing your airplanes array
NSTimeInterval *duration = 1.0f;


[airplanes enumerateObjectsUsingBlock:^(Airplane *plane, NSUInteger idx, BOOL *stop) {
    [UIView animateWithDuration:duration delay:0.1 * idx options:0 animations:^{
        // do your airplane animation here
    } completion:^(BOOL finished) {

    }];
}];

【讨论】:

  • NSTimeInterval *duration = 1.0; ;)
  • 真的,那是双倍的 :)
【解决方案2】:

如果您想保持延迟以完成飞机的动画,最好的办法是在递归函数中使用完成块来制作动画,例如假设您的飞机对象位于一个数组中,并且您的动画逻辑位于飞机模型中,这将使所有飞机在您启动第一个或第 n 个飞机的那一刻都有一个恒定的延迟。

- (void)launchAirplane:(int)whichAirplane {

if (whichAirplane >= [airplanesArray count])
 return;

AeroPlane *plane = [airplanesArray objectAtIndex:whichAirplane];

[plane flyWithAnimationDuration:0.1 completionBlock:^{
 [self launchAirPlane:++whichAirplane];
}];

}

【讨论】: