我从来没有考虑BOOL finished
过 UIView 动画完成处理程序的返回,但是阅读 Apple UIView Programming Guide 中的一些示例代码显示了这一点:
completion:^(BOOL finished) {
if (finished) {
这是必要的吗?除非动画已经完成,否则完成块不应该运行,对吗?测试似乎是多余的。
我从来没有考虑BOOL finished
过 UIView 动画完成处理程序的返回,但是阅读 Apple UIView Programming Guide 中的一些示例代码显示了这一点:
completion:^(BOOL finished) {
if (finished) {
这是必要的吗?除非动画已经完成,否则完成块不应该运行,对吗?测试似乎是多余的。
在该代码片段中执行的实际操作非常重要。动画正在从一个视图过渡到另一个视图——第一个视图被替换,然后设置一个布尔值来跟踪当前显示的是哪个视图。布尔值在完成块中设置。
[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
在这种情况下检查标志的原因。
请注意,在该指南中的大多数(如果不是全部)其他代码示例中,未检查该标志 - 这是因为它在这些情况下并不重要(例如,在第一个动画之后运行另一个动画,或者更改一些不'不依赖于动画的成功完成)。
是的,您确实应该在处理程序中尊重该布尔值。用户可能会启动动画,但在该动画正常完成之前,用户会执行其他操作以提前取消它。这个布尔很好地让你知道这种情况。
-- 更新 -- 只是为了详细说明。想象一些在屏幕上移动视图的动画。当视图完成移动时,处理程序可能会触发。假设用户触摸其他地方以产生一个新动画,该动画基本上取消了正在进行的第一个动画。您可以使用提供的 bool 来检测它。