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