我从未对UIView动画完成处理程序的返回BOOL finished
做过任何考虑,但阅读Apple UIView编程指南中的一些示例代码可以看出:
completion:^(BOOL finished) {
if (finished) {
这有必要吗?除非动画完成,否则完成块不应该运行,对吧?测试似乎多余。
答案 0 :(得分:7)
在该代码段中进行的实际操作非常重要。动画从一个视图转换到另一个视图 - 第一个被替换,然后设置一个布尔值来跟踪当前显示的是哪一个。布尔值在完成块中设置。
[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
toView:(displayingPrimary ? secondaryView : primaryView)
duration:1.0
options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
UIViewAnimationOptionTransitionFlipFromLeft)
completion:^(BOOL finished) {
if (finished) {
displayingPrimary = !displayingPrimary;
}
}];
在这种情况下,如果动画(无论出于何种原因)没有完成,那么视图还没有被交换,你绝对不想翻转displayingPrimary
的值,因为你'然后会有一个不准确的状态记录。这就是在这种情况下检查finished
标志的原因。
请注意,在该指南中的大多数(如果不是全部)其他代码示例中,不检查该标志 - 这是因为它在那些情况下不重要(在第一个之后运行另一个动画,例如,或者更改一些不的值取决于动画的成功完成。)
答案 1 :(得分:3)
是的,你真的应该尊重你的处理程序中的bool。用户可以启动动画,但在该动画正常完成之前,用户会做一些其他事情来提前取消动画。这个bool让你知道这种情况。
- 更新 - 只是详细说明。想象一下在屏幕上移动视图的一些动画。视图完成移动时,处理程序可能会触发。假设用户触摸其他地方以导致新动画基本上取消正在进行的第一个动画。您可以使用提供的bool来检测它。