2011-12-31 3 views
52

私はDOCと呼ばれ、それは言った:は何ブールパラメータはanimateWithDurationで行うん:アニメーション:完了:

が完了
...このブロックは、戻り値はありませんし、単一のブールをとります完了ハンドラが呼び出される前にアニメーションが実際に終了したかどうかを示す引数。 ...

しかし、私はあなたがブールパラメータを使用するかどうかに関係なく、completion:ブロックは常にanimations:ブロックの後に実行されることがわかります。以下に示す2つの単純なブロックベースのアニメーションコードスニペットのように、どちらも同じことをしています。

[UIView animateWithDuration:0.3f 
        delay:0.0f 
       options:UIViewAnimationCurveEaseInOut 
      animations:^{ 
       [myView setAlpha:0.0f]; 
      } 
      completion:^(BOOL finished) { 
       [myView removeFromSuperview]; 
      }]; 

[UIView animateWithDuration:0.3f 
        delay:0.0f 
       options:UIViewAnimationCurveEaseInOut 
      animations:^{ 
       [myView setAlpha:0.0f]; 
      } 
      completion:^(BOOL finished) { 
       if (finished) [myView removeFromSuperview]; 
      }]; 

そして、私は(私を含め)ほとんどの人が最初のもの(でもAppleの公式ドキュメントの一例)を使用することを見つけます。したがって、

  • ここでは正確に使用するパラメータはfinishedです。
  • または状況はどうなりますか?
+1

大きな疑問は、私のコードが今日発作を引き起こしているアニメーションを作成するまで、これについて本当に疑問に思ったことはありません。これを聞いてくれてありがとう! –

答えて

76

アニメーションがキャンセルされたときに、終了したパラメータはNOになります。通常、アニメーションを中断して別のアニメーションを開始した場合(たとえば、新しいアニメーションを開始した後、現在の状態から開始する)、またはアニメーションを直接キャンセルした場合。

これは現在のアニメーションをキャンセルしますが、完了ブロックはまだ呼び出されます。一連のアニメーションを連鎖させていたら、その連鎖を止めたいので、直前のアニメーションの連鎖は終了しただけです。

たとえば、爆弾が画面上を飛んでいるゲームがあったとします。ユーザーが爆弾をタップしないと、爆弾が爆弾の端に達すると爆発する。だから、爆弾を動かすためのアニメーションが1つあり、完成ブロックには爆発を示す別のアニメーションがあり、スコアや何かを減らすための方法が必要かもしれません。

ユーザーが爆弾をタップすると、動いているアニメーションをキャンセルし、爆弾を無害に飛ばすことになります。オリジナルの補完ブロックがまだ実行されているので、アニメーションが単独で終了したのか、取り消されたのかを知る必要があります。

+1

あなたの答えをありがとう! "_あなたは別のものを開始するためにアニメーションを中断しました_"、これはこのパラメータを使用する状況かもしれません!しかし、あなたは簡単な例を提供できますか? :p "_一連のアニメーションを連鎖していたらチェーンを止めたいので、直前のアニメーションの連鎖を続けるだけですが、前のアニメーションが終了するまで連鎖を続けることはありません'finished'パラメータも指定しないでください。私はこの方法で( 'if'文なしで)私のアプリのアニメーションのシーケンスと間違った順序エラーなしにしました。 – Kjuly

+6

私は単純な例を追加しました。 – jrturton

+0

面白い&明確な例!ありがとう! – Kjuly

関連する問題