不鼓励使用beginAnimations

meronix最近告诉我,使用beginAnimations是不鼓励的。 通过阅读UIView类的参考我明白,这是真的 – 根据苹果类ref:

iOS 4.0及更高版本不鼓励使用此方法。 您应该使用基于块的animation方法来指定您的animation。

我发现其他很多方法 – 我经常使用 – 也是“气馁”的,这意味着它们将在iOS 6(希望)中出现,但最终可能会被弃用/删除。

为什么这些方法不受鼓励?

作为一个侧面说明,现在我在各种应用程序中使用beginAnimations ,通常在显示键盘时将视图向上移动。

 //Pushes the view up if one of the table forms is selected for editing - (void) keyboardDidShow:(NSNotification *)aNotification { if ([isRaised boolValue] == NO) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); [UIView commitAnimations]; isRaised = [NSNumber numberWithBool:YES]; } } 

不知道如何用基于块的方法复制这个function; 教程链接会很好。

他们不鼓励,因为有一个更好,更清洁的select

在这种情况下,所有块animation都会自动包装您的animation更改(例如setCenter:来开始和提交调用,以免忘记。 它还提供了一个完成块,这意味着你不必处理委托方法。

苹果在这方面的文档是非常好的,但作为一个例子,以块的forms做同样的animation

 [UIView animateWithDuration:0.25 animations:^{ self.view.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); } completion:^(BOOL finished){ }]; 

另外ray wenderlich在块animation上有一个很好的post: 链接

另一种方法是考虑块animation的可能实现

 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations { [UIView beginAnimations]; [UIView setAnimationDuration:duration]; animations(); [UIView commitAnimations]; } 

在UIView上检查这个方法 ,这很简单。 现在最棘手的部分是不允许一个块有一个强烈的指向自我:

 //Pushes the view up if one of the table forms is selected for editing - (void) keyboardDidShow:(NSNotification *)aNotification { if ([isRaised boolValue] == NO) { __block UIView *myView = self.view; [UIView animateWithDuration:0.25 animations:^(){ myView.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); }]; isRaised = [NSNumber numberWithBool:YES]; } }