2011-05-06 65 views
4

我仍然不明白为什么苹果不鼓励做动画的旧方法,而是说要使用块。begin/commitAnimations vs基于块的动画

我的意思是,如何真正停止使用旧的方式?是不是只限于iOS> 4.0?是否应该使用if s填充代码,并根据当前设备的系统版本制作两种不同的实现?为什么这样做,因为旧的方法工作得很好?另外底层的实现应该是一样的吧?除了开始/提交产生难看的代码这一事实之外,有没有其他推理呢?

回答

2

我仍然为什么苹果 鼓励做 动画的老方法不明白这一点,而是说,使用 块。

苹果希望您使用最新最好的技术。苹果公司将优化其基于块的动画的所有新的iOS版本,并可能仅为基于块的动画添加新的可能性。所以这就是为什么苹果推动你到基于块的动画。

我的意思是,如何真正停止使用旧的方式?是不是只限于iOS> 4.0?

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

完全停止动画旧的方式,如果你放弃对iOS的3

支持是应该与IFS填补了代码,并根据当前设备的系统版本两种不同的实现仅仅是现实吗?为什么这样做,因为旧的方法工作得很好?另外底层的实现应该是一样的吧?除了开始/提交产生难看的代码这一事实之外,有没有其他推理呢?

那么,如果旧的方法适合你,你想支持旧的(iOS 3)设备。只需使用旧的动画方式。它没有什么问题,不要在代码中添加不必要的if语句。它只会让事情变得复杂,而且你没有赢得任何东西。

如果你的应用程序是iOS 4与块一起去,它更短,有些清洁。它也应该更容易维护,因为Apple不会继续更新旧的动画方式。

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

3

旧的方法工作正常,但我认为与块你可以选择有一个完成块。与旧的方式一样,动画开始,代码立即恢复执行。所以像下面这样的东西只有在完成移动框架的动画(在这种情况下是嵌套动画块)之后才设置视图的alpha值。一旦alpha动画完成,它就会从超级视图中移除视图。

[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的支持块的方法,如果不使用旧的方式,你可能不得不创意与时机重现嵌套动画。

+0

那么,你有'UIView'的'setAnimationDidStopSelector'与旧的方法相同,对吧? (除了正如我所说的那样,它会鼓励杂乱的代码) – pt2ph8 2011-05-06 15:24:59

+0

是的,它可以工作,但它使代码更难跟踪和调试(如你所说,混乱)。 – 2011-05-06 15:28:09

+0

是的。与ifs一起使用这两种方式会使代码变得更糟。那么苹果是否告诉我们放弃对iOS 4.0的支持? – pt2ph8 2011-05-06 15:32:05