3

チェーンとして実行する必要のある複数のアニメーションがあります。私がこれに対処してきた方法は、completionHandlerを使用して、次のアニメーションブロックを実行することです。これに対処するためのよりクリーンな方法はありますか?

[UIView animateWithDuration:1 animations^{

        // perform first animation
     }completion:(BOOL finished){

          [UIView animateWithDuration:1 animations^{

               // perform second animation
          }completion:(BOOL finished){

         }];

}];
4

2 に答える 2

10

animateWithDuration:delay:options:animations:completion:順番に開始するように遅延をずらして使用することもできますが、通常は完了ブロックを使用して実行するのが最適です。

いくつかあり、コードが読みにくくなっている場合は、ブロックを除外してください(これを頭のてっぺんから入力しているので、コンパイルされない場合があります)。

typedef void (^AnimationBlock)();

AnimationBlock firstAnimation = ^{ ... };
AnimationBlock secondAnimation = ^{ ... };

[UIView animateWithDuration:1 animations:firstAnimation completion:(BOOL finished) {
  [UIView animateWithDuration:1 animations:secondAnimation];}];

そのようなブロックの配列を取り、それらをチェーン化したカテゴリを作成することもできますが、UIViewその場合は、すべてのコーナーケースに対処する必要があります。タイミングをどのように定義しますか。中止されたアニメーションなどをどのように処理しますか。ほとんどの場合、上記がおそらく最良のアプローチです。

于 2012-04-04T22:04:21.130 に答える
1

これについてブログに投稿しました。私のアプローチは、ブロックと他のアニメーションプロパティをカプセル化するアニメーションオブジェクトを作成することです。次に、そのようなオブジェクトの配列を、それらを順番に実行する別のアニメーションオブジェクトに渡すことができます。コードはGitHubで入手できます。

于 2013-05-21T19:36:53.863 に答える