web-dev-qa-db-ja.com

BOOL /完了ブロックで自動リバース/無限リピートUIViewアニメーションを停止します

以下を設定しています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];
                         }
    }];
}
25
Luke

完了ブロックは、アニメーションが中断されたときにのみ呼び出されます。たとえば、アプリがバックグラウンドで実行され、再びフォアグラウンドに戻ったときに呼び出されます(マルチタスクを介して)。その場合、アニメーションは停止します。その場合は、アニメーションを再開してください。

アニメーションを停止するには、ビューのレイヤーから削除できます。

[button.layer removeAllAnimations];
51

古いが別のオプション。

同じビューで繰り返されない別のアニメーションを設定することもできます。これにより、オプションの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){

                     }];
}
9
Recycled Steel

[button.layer removeAllAnimations]を呼び出すことで問題を解決しました。

2
Luke

ビュークラスリファレンスのドキュメントに従って: animateWithDuration:delay:options:animations:completion: などのクラスメソッドのいずれかを使用した場合、継続時間が負の値または0に設定されている場合、変更はアニメーションを行わずに作られました。だから私はこのようなことをして無限のアニメーションを止めました:

[UIView animateWithDuration:0.0 animations:^{
      button.layer.affineTransform = CGAffineTransformIdentity;
  }];

これは、推奨される回答のように、レイヤーからすべてのアニメーションを削除するよりも優れていると思います。これは、UIViewクラスの他のすべてのクラスアニメーションメソッドに適用できることに注意してください。

1
Wael Showair