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

Kju*_*uly 65 iphone cocoa-touch objective-c uikit ios

我提到了DOC,它说:

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

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

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

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

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

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

jrt*_*ton 94

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

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

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

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

  • 我添加了一个简单的例子. (7认同)
  • 感谢您的回答!"_你已经中断动画以启动另一个_",这可能是使用此参数的情况!但是你能提供一个简单的例子吗?:p"_如果你链接了一系列动画,你会希望该链停止,所以你只会继续前一个动画的链已经完成了",但它不会继续动画链直到前一个完成没有`finished`参数.我通过这种方式(没有`if`语句)为我的应用程序中的动画序列做了没有任何错误的顺序错误. (2认同)