web-dev-qa-db-ja.com

boolパラメータがanimateWithDuration:animations:completionで正確に何をするか:

私は [〜#〜] doc [〜#〜] を参照し、それは言った:

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

しかし、boolパラメータを使用するかどうかに関係なく、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パラメータは何ですか?
  • またはどのような状況が使用されますか?
66
Kjuly

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

実際には、これにより現在のアニメーションがキャンセルされますが、完了ブロックは引き続き呼び出されます。アニメーションのシーケンスをチェーンしている場合は、そのチェーンを停止する必要があるため、前のアニメーションのチェーンが終了した後にのみ続行します。

例として、爆弾が画面を横切って飛んでいるゲームを想像してください。ユーザーが爆弾をタップしない場合、爆弾がエッジに到達すると爆発します。したがって、爆弾を移動するアニメーションが1つあり、完了ブロックには爆発を示す別のアニメーションがあり、スコアを下げるためのメソッドへの呼び出しなどがあります。

ユーザーが爆弾をタップすると、移動中のアニメーションがキャンセルされ、爆弾が無害に飛び去ります。元の完了ブロックは引き続き実行されるため、アニメーションが単独で終了したのか、キャンセルされたのかを知る必要があります。

94
jrturton