【问题标题】:Is it necessary to test the BOOL finished in a completion handler for UIView animation?是否有必要在 UIView 动画的完成处理程序中测试 BOOL 完成?
【发布时间】:2012-05-11 17:05:38
【问题描述】:

我从来没有考虑过 UIView 动画完成处理程序返回的BOOL finished,但是阅读 Apple UIView 编程指南中的一些示例代码可以看出:

completion:^(BOOL finished) {
 if (finished) {

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

【问题讨论】:

    标签: iphone objective-c uiview


    【解决方案1】:

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

    [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 标志的原因。

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

    【讨论】:

    • 所以听起来完成块实际上可以运行,即使完成的布尔值为零。为什么会这样?因为它是一个“完成”块,它不会只在前一个块确实完成的情况下运行吗?
    • 使用其中一种方法开始新动画,可以选择让新动画首先中断。还有一个选项允许用户与视图交互,这可能会提供取消动画的机会。
    • 根据文档transitionFromView在动画的BEGINNING添加toView,在动画的END从superView中取出fromView。这是否意味着如果finished 是假的,那么fromView 和toView 仍然存在?因为在我的案例中,我见过两者都消失的案例。
    【解决方案2】:

    是的,您确实应该在处理程序中尊重该布尔值。用户可能会启动动画,但在该动画正常完成之前,用户会执行其他操作以提前取消它。这个 bool 很好地让你知道这种情况。

    --更新-- 只是为了详细说明。想象一些在屏幕上移动视图的动画。当视图完成移动时,处理程序可能会触发。假设用户触摸其他地方以产生一个新动画,该动画基本上取消了正在进行的第一个动画。您可以使用提供的 bool 来检测。

    【讨论】:

    • 你是不是建议即使动画被取消,完成处理程序可能仍然运行?
    • 希望有人在这方面比我更有信心,但是是的,我认为是这样。在它运行之前不会被取消,但在它可以完成之前被中断。
    • 完成块只有一个含义,只有在动画成功完成后需要做一些特定的事情时才应该验证和使用它。如果您不关心动画会发生什么,那么验证动画是否成功完成毫无意义......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多