13

meronix 最近通知我,beginAnimations不鼓励使用 of。通读UIView类参考,我发现这确实是真的 - 根据 Apple 类参考:

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

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

4

2 回答 2

26

他们感到气馁,因为有更好、更清洁的选择

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

Apple 在这方面的文档非常好,但作为一个例子,要以块的形式制作相同的动画,它会是

[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];
}
于 2012-07-30T14:33:31.007 回答
1

在 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];
  }
}
于 2012-07-30T14:36:41.693 回答