私は [〜#〜] 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
パラメータは何ですか?アニメーションがキャンセルされた場合、終了したパラメーターはNOになります。通常、アニメーションを中断して別のアニメーションを開始した場合(たとえば、現在のアニメーションが終了する前に、現在の状態から開始するパラメーターで新しいアニメーションを開始した場合)または、アニメーションを直接キャンセルしました。
実際には、これにより現在のアニメーションがキャンセルされますが、完了ブロックは引き続き呼び出されます。アニメーションのシーケンスをチェーンしている場合は、そのチェーンを停止する必要があるため、前のアニメーションのチェーンが終了した後にのみ続行します。
例として、爆弾が画面を横切って飛んでいるゲームを想像してください。ユーザーが爆弾をタップしない場合、爆弾がエッジに到達すると爆発します。したがって、爆弾を移動するアニメーションが1つあり、完了ブロックには爆発を示す別のアニメーションがあり、スコアを下げるためのメソッドへの呼び出しなどがあります。
ユーザーが爆弾をタップすると、移動中のアニメーションがキャンセルされ、爆弾が無害に飛び去ります。元の完了ブロックは引き続き実行されるため、アニメーションが単独で終了したのか、キャンセルされたのかを知る必要があります。