bool参数究竟在animateWithDuration中做了什么:动画:完成:

时间:2011-12-31 07:18:08

标签: iphone objective-c ios cocoa-touch uikit

我提到DOC并且说:

  

完成
  ...此块没有返回值,并且接受一个布尔参数,该参数指示在调用完成处理程序之前动画是否实际完成。 ...

但是我发现无论你是否使用bool参数,completion:块总是在animations:块之后执行。就像下面显示的两个简单的基于块的动画代码片段一样,它们都是相同的。

[UIView animateWithDuration:0.3f
                  delay:0.0f
                options:UIViewAnimationCurveEaseInOut
             animations:^{
                 [myView setAlpha:0.0f];
             }
             completion:^(BOOL finished) {
                 [myView removeFromSuperview];
             }];

[UIView animateWithDuration:0.3f
                  delay:0.0f
                options:UIViewAnimationCurveEaseInOut
             animations:^{
                 [myView setAlpha:0.0f];
             }
             completion:^(BOOL finished) {
                 if (finished) [myView removeFromSuperview];
             }];

我发现大多数人(包括我)使用的是第一个(甚至是苹果的官方文档示例)。所以,

  • 这里使用的finished参数究竟是什么?
  • 或者会使用什么情况?

1 个答案:

答案 0 :(得分:90)

取消动画时,完成的参数将为NO:通常,当您中断动画以启动另一个动画时(例如,您已经开始新动画,在当前动画结束之前,参数将从当前状态)或您已直接取消动画。

实际上,这会取消当前动画,但仍会调用完成块。如果你链接一系列动画,你会希望该链停止,所以你只能继续上一个动画的链完成。

举个例子,假设你有一个炸弹飞过屏幕的游戏。如果用户没有点击炸弹,它会在到达边缘时爆炸。所以你有一个动画来移动炸弹,你的完成块会有另一个动画来显示爆炸,也许会调用某种方法来降低分数或者什么。

如果用户点击炸弹,你将取消移动的动画并让炸弹无害地飞走。您的原始完成块仍将被执行,因此您需要知道动画是自己完成还是已取消。