objective-c - 不鼓励使用 beginAnimations

  显示原文与译文双语对照的内容
0 0

我最近被meronix告知,不鼓励使用 beginAnimations 。 通过 UIView 类引用阅读,我看到这确实是 true - 根据苹果类的引用:

在 iOS 4.0和更高版本中不建议使用这里方法。 应使用基于块的动画方法来指定动画。

我看到很多其他的方法,我经常使用- 也是"不推荐",这意味着它们会出现在 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];
 }
}

不确定如何使用基于块的方法复制这里功能;教程链接很好。

时间: 原作者:

0 0

他们不鼓励这样做,因为有更好。更清晰的选择。

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

苹果的文档很好,但作为一个例子,以块形式做同样的动画将是


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

ray Wenderlich在块动画上有很好的文章: 链接

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


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

原作者:
0 0

检查这个方法在UIView上,这使得它非常简单。 现在最棘手的部分是 NOT,它允许块拥有强大的指向自身的指针:


//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];
 }
}

...