13

私は最近 meronix から、 の使用beginAnimationsは推奨されないと知らされました。クラスリファレンスを読む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

They are discouraged because there is a better, cleaner alternative

In this case all a block animation does is automatically wrap your animation changes (setCenter: for example) in begin and commit calls so you dont forget. It also provides a completion block, which means you don't have to deal with delegate methods.

Apple's documentation on this is very good but as an example, to do the same animation in block form it would be

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

Also ray wenderlich has a good post on block animations: link

Another way is to think about a possible implementation of block animations

+ (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 に答える