15

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

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

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

4

2 回答 2

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在这种情况下检查标志的原因。

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

于 2012-05-02T18:37:20.253 回答
3

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

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

于 2012-05-02T08:36:07.950 回答