web-dev-qa-db-ja.com

iOS-UIView animateWithDurationの完了ブロックが早く呼び出されます

テーブルビューのセルが選択されたときにアニメーションを実行しようとしています。何らかの理由で、完了ブロックの呼び出しが早すぎます。期間を10秒に設定しても、完了ブロックはすぐに呼び出されます。

[UIView animateWithDuration:10.0 animations:^{
    message.frame = newFrame;
} completion:^(BOOL finished) {
    NSLog(@"DONE???");
}];

なぜこれが起こっているのかについての考えはありますか?ありがとう。

26
ryan

IViewドキュメント から:

完了

アニメーションシーケンスの終了時に実行されるブロックオブジェクト。このブロックには戻り値はなく、完了ハンドラが呼び出される前にアニメーションが実際に終了したかどうかを示す単一のブール引数を取ります。アニメーションの継続時間が0の場合、このブロックは次の実行ループサイクルの開始時に実行されます。このパラメーターはNULLの場合があります。

つまり、アニメーションが完了したときにのみコードが実行されるという保証はありません。実行の条件として「終了」パラメータを確認することをお勧めします。

27
Stavash

はい。なんらかの理由で中断されているため、呼び出しが早すぎます。おそらく、モーダルプレゼンテーションの移行または他の何かによるものでしょう。必要に応じて、次の方法がお勧めです。次のように手動でアニメーションコードの実行を遅らせることで、競合を回避します。

// To get this in Xcode very easily start typing, "dispatch_aft..."

// Note the "0.2". This ensures the outstanding animation gets completed before we start ours
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:1.0 delay:0 options:0 animations:^{
        // Your animation code
    } completion:^(BOOL finished) {
        // Your completion code
    }];
});
17
John Erck

アニメーションの効果がない場合、完了を早期に呼び出すこともできます。ビューのアルファをすでに持っている値に設定する。

6
Luke