以下を設定していますUIView animateWithDuration:
メソッド。プログラムの別の場所にmy animationOn
BOOLを設定して、無限ループの繰り返しをキャンセルすることを意図しています。アニメーションのサイクルが終了するたびにcompletion
ブロックが呼び出されるのではないかという印象を受けましたが、そうではないようです。
completion
ブロックが繰り返しアニメーションで呼び出されたことはありますか?そうでない場合、この方法の外側からこのアニメーションを停止できる別の方法はありますか?
- (void) animateFirst: (UIButton *) button
{
button.transform = CGAffineTransformMakeScale(1.1, 1.1);
[UIView animateWithDuration: 0.4
delay: 0.0
options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
animations: ^{
button.transform = CGAffineTransformIdentity;
} completion: ^(BOOL finished){
if (!animationOn) {
[UIView setAnimationRepeatCount: 0];
}
}];
}
完了ブロックは、アニメーションが中断されたときにのみ呼び出されます。たとえば、アプリがバックグラウンドで実行され、再びフォアグラウンドに戻ったときに呼び出されます(マルチタスクを介して)。その場合、アニメーションは停止します。その場合は、アニメーションを再開してください。
アニメーションを停止するには、ビューのレイヤーから削除できます。
[button.layer removeAllAnimations];
古いが別のオプション。
同じビューで繰り返されない別のアニメーションを設定することもできます。これにより、オプションのUIViewAnimationOptionBeginFromCurrentStateを使用して、現在の状態でキャプチャし、現在の状態に戻すこともできます。完了ブロックも呼び出されます。
-(void)someEventSoStop
{
button.transform = CGAffineTransformMakeScale(1.0, 1.0);
[UIView animateWithDuration: 0.4
delay: 0.0
options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
animations: ^{
button.transform = CGAffineTransformIdentity;
} completion: ^(BOOL finished){
}];
}
[button.layer removeAllAnimations]
を呼び出すことで問題を解決しました。
ビュークラスリファレンスのドキュメントに従って: animateWithDuration:delay:options:animations:completion: などのクラスメソッドのいずれかを使用した場合、継続時間が負の値または0に設定されている場合、変更はアニメーションを行わずに作られました。だから私はこのようなことをして無限のアニメーションを止めました:
[UIView animateWithDuration:0.0 animations:^{
button.layer.affineTransform = CGAffineTransformIdentity;
}];
これは、推奨される回答のように、レイヤーからすべてのアニメーションを削除するよりも優れていると思います。これは、UIViewクラスの他のすべてのクラスアニメーションメソッドに適用できることに注意してください。