是否有必要在UIView动画的完成处理程序中测试完成的BOOL?

joh*_*ers 15 iphone objective-c uiview

我从来没有想过返回BOOL finished的UIView动画完成处理程序,但是阅读Apple UIView编程指南中的一些示例代码显示了这一点:

completion:^(BOOL finished) {
 if (finished) {
Run Code Online (Sandbox Code Playgroud)

这有必要吗?除非动画完成,否则完成块不应该运行,对吧?测试似乎多余.

Jos*_*ell 7

在该代码段中进行的实际操作非常重要.动画从一个视图转换到另一个视图 - 第一个被替换,然后设置一个布尔值来跟踪当前显示的是哪一个.布尔值在完成块中设置.

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
    toView:(displayingPrimary ? secondaryView : primaryView)
    duration:1.0
    options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
                UIViewAnimationOptionTransitionFlipFromLeft)
    completion:^(BOOL finished) {
        if (finished) {
            displayingPrimary = !displayingPrimary;
        }
}];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果动画(无论出于何种原因)没有完成,那么视图还没有被交换,你绝对不想翻转它的值displayingPrimary,因为你将有一个不准确的记录你的状态.这就是为什么finished在这种情况下检查标志的原因.

请注意,在该指南中的大多数(如果不是全部)其他代码示例中,不检查该标志 - 这是因为它在那些情况下不重要(在第一个之后运行另一个动画,例如,或者更改某个值不会不依赖于动画的成功完成.

  • 所以听起来像完成块实际上可以运行,即使bool完成为零.为什么会这样?因为它是一个"完成"块,它只会在前一个块确实完成时才运行吗? (2认同)