32

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

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

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

4

4 に答える 4

30

UIViewのドキュメントから:

完了

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

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

于 2013-02-03T07:55:19.703 に答える
17

はい。何らかの理由で中断されているため、呼び出されるのが早すぎます。おそらく、モーダル プレゼンテーション トランジションか、それ以外の何かによるものでしょう。ニーズに応じて、次のソリューションが適している場合があります。次のように、アニメーション コードの実行を手動で遅らせることで競合を回避します。

// 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
    }];
});
于 2014-11-19T22:02:17.427 に答える
1

役立つ場合に備えて、これをここに投稿してください。私の場合、keyframeアニメーションを使用していて、完了ブロックがすぐに呼び出されました。次の概念に注意してください。

  • duration: 秒単位で測定される、アニメーション全体の継続時間。負の値または 0 を指定すると、変更はアニメーションなしですぐに行われます。

  • frameStartTime: 指定されたアニメーションを開始する時間。この値は 0 から 1 の範囲である必要があります。0 はアニメーション全体の開始を表し、1 はアニメーション全体の終了を表します。たとえば、継続時間が 2 秒のアニメーションの場合、開始時間を 0.5 に指定すると、アニメーション全体の開始から 1 秒後にアニメーションの実行が開始されます。

  • frameDuration: 指定された値にアニメーション化する時間の長さ。この値は 0 から 1 の範囲である必要があり、アニメーション全体の長さに対する相対的な時間を示します。値 0 を指定すると、アニメーション ブロックで設定したすべてのプロパティが、指定した開始時間にすぐに更新されます。ゼロ以外の値を指定すると、プロパティはその時間にわたってアニメーション化されます。たとえば、継続時間が 2 秒のアニメーションの場合、継続時間を 0.5 に指定すると、アニメーションの継続時間は 1 秒になります。

これらの値のいずれかを間違って設定すると、完了が呼び出される時間に干渉します。

于 2021-03-16T14:53:43.407 に答える