15

UIViewアニメーション完了ハンドラーが返されることを考えたことはありませんBOOL finishedが、Apple UIViewプログラミングガイドのサンプルコードを読むと、次のことがわかります。

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

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

4

2 に答える 2

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この場合、フラグがチェックされるのはそのためです。

そのガイドの他のコードサンプルのほとんど(すべてではないにしても)では、フラグがチェックされていないことに注意してください-それはそれらの場合(最初の後に別のアニメーションを実行する、またはそうでない値を変更するなど)では重要ではないためですアニメーションが正常に完了するかどうかには依存しません)。

于 2012-05-02T18:37:20.253 に答える
3

はい、ハンドラーでそのブール値を本当に尊重する必要があります。ユーザーはアニメーションを開始する場合がありますが、そのアニメーションが正常に完了する前に、ユーザーは何か他のことを行ってアニメーションを早期にキャンセルします。このブール値は、そのような場合をよく知らせます。

--更新-詳しく説明します。画面上でビューを移動するアニメーションを想像してみてください。ビューの移動が完了すると、ハンドラーが起動する場合があります。ユーザーが別の場所に触れて、進行中のこの最初のアニメーションを本質的にキャンセルする新しいアニメーションを作成するとします。提供されているboolを使用してそれを検出できます。

于 2012-05-02T08:36:07.950 に答える