26

プログラムの他の場所にBOOLを設定して、その無限ループの繰り返しをキャンセルすることを目的として、次のUIView animateWithDuration:メソッドを設定しています。アニメーションのサイクルが終了するたびanimationOnにブロックが呼び出されるという印象を受けましたが、そうではないようです。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];
                         }
    }];
}
4

4 に答える 4

54

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

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

[button.layer removeAllAnimations];
于 2012-12-21T13:59:25.357 に答える
9

古いが別のオプション。

同じビューで繰り返されない別のアニメーションを設定することもできます。その方法で、現在の状態でアニメーションをキャプチャし、オプション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){

                     }];
}
于 2015-02-26T12:07:09.560 に答える
2

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

于 2012-12-21T14:11:03.513 に答える
1

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

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

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

于 2016-01-21T19:28:08.063 に答える