不鼓励使用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]; } }