テーブルビューのセルが選択されたときにアニメーションを実行しようとしています。何らかの理由で、完了ブロックの呼び出しが早すぎます。期間を10秒に設定しても、完了ブロックはすぐに呼び出されます。
[UIView animateWithDuration:10.0 animations:^{
message.frame = newFrame;
} completion:^(BOOL finished) {
NSLog(@"DONE???");
}];
なぜこれが起こっているのかについての考えはありますか?ありがとう。
IViewドキュメント から:
完了
アニメーションシーケンスの終了時に実行されるブロックオブジェクト。このブロックには戻り値はなく、完了ハンドラが呼び出される前にアニメーションが実際に終了したかどうかを示す単一のブール引数を取ります。アニメーションの継続時間が0の場合、このブロックは次の実行ループサイクルの開始時に実行されます。このパラメーターはNULLの場合があります。
つまり、アニメーションが完了したときにのみコードが実行されるという保証はありません。実行の条件として「終了」パラメータを確認することをお勧めします。
はい。なんらかの理由で中断されているため、呼び出しが早すぎます。おそらく、モーダルプレゼンテーションの移行または他の何かによるものでしょう。必要に応じて、次の方法がお勧めです。次のように手動でアニメーションコードの実行を遅らせることで、競合を回避します。
// 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
}];
});
アニメーションの効果がない場合、完了を早期に呼び出すこともできます。ビューのアルファをすでに持っている値に設定する。