2011-12-31 29 views
52

我提到的DOC,它说:究竟做布尔参数做animateWithDuration:动画:完成:

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

但是我发现没有使用布尔参数或没有事,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

伟大的问题,我从来没有真正想知道这件事,直到我的代码今天创建引起惊厥的动画。感谢您提出这个问题! – 2016-06-01 19:00:51

回答

76

完成的参数是NO时的动画效果被取消:通常情况下,当你已经中断动画开始播放另一个(例如,你已经开始了新的动画,当前一个结束之前,与参数从当前状态开始)或者您已经直接取消了动画。

实际上这会取消当前的动画,但完成块仍然被调用。如果您要链接一系列动画,您会希望链条停止,因此您只会继续完成前一个动画的链接。

举一个例子,假设你有一个游戏,炸弹在屏幕上飞行。如果用户没有敲击炸弹,它会在到达边缘时爆炸。所以你有一个动画来移动炸弹,而你的完成块会有另一个动画来显示爆炸,也可能是一个调用某种方法来降低分数的东西。

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

+1

感谢您的回答! “_you已经中断了动画以启动另一个one_”,这可能是使用此参数的情况!但你能提供一个简单的例子吗? :p“_如果你链接了一系列动画,你会希望该链停止,所以你只会继续前一个动画的链完成_”,但它不会继续动画链,直到前一个动画完成没有'finished'参数。我通过这种方式(没有'if'语句)在我的应用程序中执行动画序列并且没有任何错误的顺序错误。 – Kjuly 2011-12-31 11:06:59

+6

我已经添加了一个简单的例子。 – jrturton 2011-12-31 12:13:26

+0

一个有趣而清晰的例子!谢谢! – Kjuly 2011-12-31 13:36:12