begin / commitAnimations vs基于块的动画

时间:2011-05-06 14:50:56

标签: iphone cocoa-touch

我仍然不明白为什么Apple不鼓励使用旧的动画方法,而是说要使用块。

我的意思是,如何真实地停止使用旧的方式?不是块iOS> 4.0只?是否应该用if填充代码并根据当前设备的系统版本进行两种不同的实现?为什么这样做,因为旧的方法工作得很好?加上底层实现应该是一样的,对吗?除了begin / commit产生难看的代码之外,还有任何理由吗?

2 个答案:

答案 0 :(得分:3)

旧方法工作正常,但我认为使用块您可以选择使用完成块。与旧方式一样,动画开始,代码立即恢复执行。因此,类似下面的内容仅在动画移动框架完成后才设置视图的alpha(在本例中为嵌套动画块)。完成alpha动画后,它会从superview中删除视图。

[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationCurveEaseOut animations:^(void) {
        CGRect frame = self.actionView.frame;
        self.actionView.frame = CGRectMake(frame.origin.x, 370, frame.size.width, frame.size.height);
    }
                     completion:^(BOOL finished) {                         
                         [UIView animateWithDuration:0.2 delay:0 options:0 animations:^(void) {
                             [self.blockingView setAlpha:0];                             
                         } completion:^(BOOL finished) {
                             [self.actionView removeFromSuperview];
                             [self.blockingView removeFromSuperview];
                         }];

                     }];

你必须使用[respondsToSelector]来确定UIView是否支持块方法,如果不使用旧方法,你可能必须具有创造性,以便重现嵌套动画。

答案 1 :(得分:2)

  

我仍然不明白苹果的原因   劝阻旧的做法   动画,而是说要使用   块。

Apple希望您使用最新最好的技术。 Apple将针对基于块的动画优化其所有新的iOS版本,并且可能仅为基于块的动画添加新的可能性。这就是为什么Apple会推动你使用基于块的动画。

  

我的意思是,如何真实地停止使用旧的方式?不是块iOS> 4.0只?

是的,块是iOS>仅限4.0。因此,如果您的应用程序仅适用于iOS 4.0+,则可以使用基于块的动画。或者,您可以检查块的可用性,并仅为iOS 4.0+设备添加特定动画。

如果您放弃对iOS 3的支持,完全停止动画旧方法是正确的。

  

是否应该用ifs填充代码并根据当前设备的系统版本进行两种不同的实现?为什么这样做,因为旧的方法工作得很好?加上底层实现应该是一样的,对吗?除了begin / commit产生难看的代码之外,还有任何理由吗?

好吧,如果旧方法适合您并且您想支持旧版(iOS 3)设备。只需使用旧的动画方式。它没有任何问题,不要在代码中添加不必要的if语句。它只会让事情变得复杂,而你却无法做到这一点。

如果您的应用程序是iOS 4,请使用块,它更短并且有点清洁。它也应该更容易维护,因为Apple不会继续更新旧的动画方式。

(你总是可以在将来的某个地方添加if语句,如果有动画你只能使用块,然后使用旧方法回退到另一个不那么复杂的动画。但那是未来的事情。)< / p>