2012-05-02 4 views
15

私はUIViewのアニメーションが完了ハンドラの戻りBOOL finishedに任意の考えを与えられていないが、AppleのUIViewプログラミングガイドでいくつかのサンプルコードを読み取る決してきたが、これを示していますUIViewアニメーションの補完ハンドラで終了したBOOLをテストする必要はありますか?

completion:^(BOOL finished) { 
if (finished) { 

は、この必要ですか?アニメーションがとにかく終了しない限り、完了ブロックは実行されません。テストは重複しているようです。

答えて

7

そのコードスニペットで実際に行われている処理は非常に重要です。アニメーションはあるビューから別のビューに移行しています。最初のビューは置き換えられ、現在表示されているビューを追跡するためにブール値が設定されます。ブール値は完了ブロックに設定されます。この場合

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView) 
    toView:(displayingPrimary ? secondaryView : primaryView) 
    duration:1.0 
    options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight : 
       UIViewAnimationOptionTransitionFlipFromLeft) 
    completion:^(BOOL finished) { 
     if (finished) { 
      displayingPrimary = !displayingPrimary; 
     } 
}]; 

、アニメーションが(何らかの理由で)完全に、そして意見が交換されていないいない、とあなたは絶対に displayingPrimaryの値を反転させたくない、あなたのために」場合あなたの身分の記録が不正確になります。そのため、この場合には finishedフラグがチェックされています。

このガイドの他のコードサンプルの大部分(すべてではないにしても)でフラグがチェックされていないことに注意してください - そのような場合(最初のの値はではありません。アニメーションの正常終了に依存します)。

+2

完成したブールが実際には0になっても実行できるようです。なぜそれが起こるだろうか?それは「完了」ブロックなので、前のブロックが実際に完了した場合にのみ実行されますか? – johnbakers

+1

これらのメソッドの1つで新しいアニメーションを開始すると、新しいアニメーションを最初に中断させるオプションがあります。ビューとのユーザーの対話を許可するオプションもあり、アニメーションをキャンセルする機会があります。 –

+0

docによると、transitionFromViewは、アニメーションの開始時にtoViewを追加し、アニメーションの終了時にsuperViewからfromViewを取得します。終了した場合は、fromViewとtoViewの両方がfalseであることを意味しますか?私の場合、私は両方がなくなっているケースを見たので。 –

3

はい、あなたは本当にあなたのハンドラーでそのブールを敬うべきです。ユーザはアニメーションを開始することができるが、アニメーションが正常に完了する前に、ユーザはそれを早期にキャンセルするために何か他のことを行う。このブールはあなたにそのような場合を知らせます。

- 更新 - ちょっと詳しく説明します。画面を横切ってビューを動かすアニメーションを想像してみてください。ビューの移動が完了すると、ハンドラが起動することがあります。ユーザーが他の場所に触れて、進行中の最初のアニメーションを本質的に取り消す新しいアニメーションを作成するとします。あなたはそれを検出するために提供されたブールを使用することができます。

+0

アニメーションがキャンセルされても、完了ハンドラがまだ実行されている可能性がありますか? – johnbakers

+0

誰かが私がこれ以上に自信を持ってチャーミングすることを望みますが、はい、私はそうだと思います。これまで実行される前にキャンセルされていませんが、完了する前に中断されました。 –

+0

完了ブロックには意味があるため、アニメーションが正常に完了した後で具体的な処理が必要な場合にのみ、検証して使用する必要があります。アニメーションに何が起こっても気にしなければ、アニメーションが正常に終了したかどうかを検証する必要はありません... – Lefteris

関連する問題