19

私のanimationOn BOOLを無限ループ反復をキャンセルするように設定するために、次のUIView animateWithDuration:メソッドを設定しています。私はcompletionブロックは、アニメーションのサイクルが終了するたびに呼び出されることになるという印象の下にあったが、これはケースのように表示されません。これまで繰り返しアニメーションと呼ばれるcompletionブロックがBOOL/completionブロックによる自動逆転/無限リピートUIViewアニメーションの停止

ですか?もしそうでなければ、私はこのアニメーションの外側からこのアニメーションを止めることができる別の方法がありますか?

- (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]; 
         } 
    }]; 
} 

答えて

45

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

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

[button.layer removeAllAnimations]; 
+0

は、私は怖いです。アニメーションは、トランスフォームの変更が適用された後もまだ進行中です。 (私は '.transform'を' CGAffineTransformMakeScale(1.0、1.0) 'に設定しました)。 – Luke

+0

私は何か別のものが見つかった。私は自分の答えを更新しました。それを試すことができますか? –

+0

ああ、あなたは私が地雷を追加ヒットとしてユアーズはかなり登場、私は意味、あなたがそれを最初に入力したことを考え出し –

2

私は[button.layer removeAllAnimations]を呼び出すことによって、問題を解決してきました。

+0

....あなたは、複数のアニメーションブロックを持っていて、唯一のアニメーションブロックの1つを停止したい場合、私は疲れたが、それは私のために動作しません。あなたのコードでこのメソッドをどこから呼び出すのですか? – Supertecnoboff

8

古いが、別のオプションを選択します。

同じビューで繰り返していない別のアニメーションを設定することもできます。この方法では、現在の状態でキャプチャして、UIViewAnimationOptionBeginFromCurrentStateオプションを使用して現在の状態に戻すこともできます。完了ブロックも呼び出されます。 Viewクラスリファレンスのドキュメントを1として

-(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){ 

        }]; 
} 
+0

これはアニメーションを円滑に元に戻すので、これは他のソリューションよりも優れたアプローチです。 – Nikolozi

1

:持続時間が負の値または0に設定されている場合は、そのようなanimateWithDuration:delay:options:animations:completion: としてクラスのいずれかの方法を使用した場合、変更はアニメーションを実行せずに作られています。 ので、私は無限のアニメーションを停止するには、このような何かをした:

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

私は、これは提案の答えのように層からすべてのアニメーションを削除するよりも優れていると思います。 これは、UIViewクラス内の他のすべてのクラスアニメーションメソッドに適用可能であることに注意してください。動作しませんでした

+0

これは私には役に立たなかった。私はremoveAllAnimationsを呼び出さなければならなかった。 –

関連する問題