2013-02-03 8 views
23

テーブルビューのセルが選択されたときにアニメーションを実行しようとしています。なんらかの理由で、完了ブロックが早すぎて呼び出されるようになっています。継続時間を10秒に設定しても、完了ブロックはすぐに呼び出されます。iOS - UIView animateWithDurationの完了ブロックがあまりに早く呼び出される

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

これはなぜ起こっているのですか?ありがとう。 UIView documentationから

+0

このコードはどこで実行されていますか?例えば、 'init'メソッドの中にある場合、それはあまりにも早すぎます。これは、コントロールが作成された後、 'viewDidLoad'などで行われます。 'finished'パラメータをチェックすることもできます。 – Rob

+1

完成したパラメータはどれですか?いいえの場合、アニメーションが中断されることがあります。 –

+0

申し訳ありませんが、ドミニク・サンダーは正しい考えがあります。 finishedのBOOL値は "NO"を記録しています。 – ryan

答えて

23

完了

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

これは、アニメーションが実行されたときにのみコードが実行されるという保証はないということです。私は実行の条件として "完了"パラメータをチェックすることをお勧めします。

+1

それで、私が理解していることを確認するために、アニメーションが明示的に中断されずに別のアニメーションに置き換えられなくても、完成ブロックが実際に完了する前に呼び出されるということですか?あるいは、あなたが知っている唯一の例外は2つのシナリオですか? – Nate

+2

私がこのブロックで早期に呼び出された唯一の実際の経験は、アニメーションが終了する前に中断されたときです。 – Stavash

+1

私はiOS 9.3とは逆の問題があります - 完了ブロックは決して呼び出されません!それがどうして起こるのか? – RPM

15

はい。それは何とか中断されているので、早すぎると呼ばれています。おそらくモーダルプレゼンテーションの移行か、おそらく他の何かによって。ニーズに応じて、次のようなソリューションが好きかもしれません。私たちは、手動でそのような私たちのアニメーションコードの実行を遅延させることにより、競合を避ける:

// 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 
    }]; 
}); 
+1

代わりに[containsView LayoutIfNeeded]を呼び出して[UIView animateWith .....]を呼び出す前にアニメーションスタックをクリアすることもできます。 – BonanzaDriver

+0

あまり美しくないが、これは却下後にアニメートする唯一の解決策である –

+0

ありがとう、私は昨日からこれについての解決策を探していた –

2

アニメーションは効果がありません場合は完了が早いと呼ばれるすることも可能ですが、例えばビューのアルファをすでに持っている値に設定します。

関連する問題