Blocks を使ったアニメーションのひっかかりを解消する

2011年8月22日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Cocoaの日々: [iOS] UITableView でプルダウンすると再読込するユーザインタフェースを実装

以前紹介した投稿でアニメーションにひっかかりを感じると書いた。
UITableView を下にドラッグした時に画面上部の矢印が下向き↓からクルッと回転して上向き↑になるアニメーションが起こる。これを iPhoneで実行してみるとカクっとひっかかるような感じがあった。コードはこんな感じ。
[UIView animateWithDuration:0.2
         animations:^{
             self.imageView.transform =
                CGAffineTransformMakeRotation(endAngle);
         }];
Blocks によるアニメーションを使っている。


beginAnimations


先日この件で Kyasu さんより情報提供があった。
kyasu says: 
2011年8月18日19:43

>プルダウンしてアニメーションが起きる時に若干のひっかかりを感じた。
この件ですが、Blocksを使わないでbeginAnimations,commitAnimationsを
使うと動作がブロックされないようです。
?...試してみよう。
[UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    self.imageView.transform =
    CGAffineTransformMakeRotation(endAngle);
    [UIView commitAnimations];
するとひっかかりが無くなってスムーズにアニメーションが動作するようになった。おお、これはいい。

ただ、その一方で beginAnimations と blocks アニメーションで違いがある?という疑問が湧いてきた。


UIViewAnimationOptionAllowUserInteraction


違いはあった。
UIViewAnimationOptionAllowUserInteraction

普通の表示だけのアニメーションだと違いは無いのだが今回のようにユーザが操作(ドラッグ)している最中にアニメーションを動作させる場合、blocks アニメーションのデフォルト動作では今回のようにひっかかりが発生する。この場合は blocksアニメーションのオプションに UIViewAnimationOptionAllowUserInteraction を指定する必要がある。こんな感じ。
[UIView animateWithDuration:0.2
                          delay:0.0
                        options:UIViewAnimationOptionCurveLinear |
                                UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         self.imageView.transform =
                         CGAffineTransformMakeRotation(endAngle);
                         
                     }
                     completion:NULL
     ];
beginAnimations を使ったアニメーションではデフォルトでこのオプションと同等の動作になっているということなのだろう。


ソースコード


改良版は GitHub からどうぞ。
CustomCellSample at 2011-08-29 from xcatsan/iOS-Sample-Code - GitHub


- - - -
この件はずっと気になっていたので解消されてうれしい。
Kyasu さん、情報提供ありがとうございました。


Responses

Leave a Response

人気の投稿(過去 30日間)