我提到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
参数究竟是什么?答案 0 :(得分:90)
取消动画时,完成的参数将为NO:通常,当您中断动画以启动另一个动画时(例如,您已经开始新动画,在当前动画结束之前,参数将从当前状态)或您已直接取消动画。
实际上,这会取消当前动画,但仍会调用完成块。如果你链接一系列动画,你会希望该链停止,所以你只能继续上一个动画的链完成。
举个例子,假设你有一个炸弹飞过屏幕的游戏。如果用户没有点击炸弹,它会在到达边缘时爆炸。所以你有一个动画来移动炸弹,你的完成块会有另一个动画来显示爆炸,也许会调用某种方法来降低分数或者什么。
如果用户点击炸弹,你将取消移动的动画并让炸弹无害地飞走。您的原始完成块仍将被执行,因此您需要知道动画是自己完成还是已取消。