UIViewブロックベースのアニメーションをキャンセルするにはどうすればよいですか?


86

私はたくさんのSOのものとAppleの参考文献を検索しましたが、それでも私の問題を管理することができません。

私が持っているもの:

  1. 2UIImageView秒と2UIButton秒が接続された画面
  2. 2種類のアニメーション:
    1. 各画像を次々にスケールアップしてからスケールダウンします。 viewDidLoad
    2. ボタンが押されると(それぞれの「内側」に隠されたカスタムボタンUIImageView)、適切なアニメーションがトリガーされますUIImageView(両方ではなく、1つだけ)(スケールアップしてからダウンします)。
    3. iOS4 +用に書いているときに、ブロックベースのアニメーションを使用するように言われました。

必要なもの:

実行中のアニメーションをキャンセルするにはどうすればよいですか?最後の1つを除いて結局キャンセルすることができました...:/

これが私のコードスニペットです:

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

smallLetter UIImageView(ボタンを介して)押すbigLetterとアニメーションが正しくキャンセルされるため、どういうわけかが正しく機能していません...

編集: 私はこの解決策を使用しましたが、それでもスケールダウンに問題がありますsmallLetter UIImageView-まったくキャンセルしません... 解決策

EDIT2:次/前のメソッドの最初にこれを追加しました:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

問題が残る...:/アニメーションチェーン内の文字の最後のアニメーションを中断する方法がわからない


ねえ、ハリ・クンワーの答えは今受け入れられるべきだと思います。
marczellm

最近で、UIViewPropertyAnimatorを使用する必要あります。これも非常に簡単です。
Fattie

回答:


151

次のコマンドを呼び出すことで、ビュー上のすべてのアニメーションを停止できます。

[view.layer removeAllAnimations];

(view.layerのメソッドを呼び出すには、QuartzCoreフレームワークをインポートする必要があります)。

すべてのアニメーションではなく、特定のアニメーションを停止する場合は、UIViewアニメーションヘルパーメソッドではなくCAAnimationsを明示的に使用することをお勧めします。そうすれば、よりきめ細かく制御でき、名前で明示的にアニメーションを停止できます。

Apple Core Animationのドキュメントは、次の場所にあります。

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html


10
私自身の観察では、removeAllAnimationsを呼び出した後、後続のanimateWithDurationが機能しなくなったことを追加したいだけです。これは、ページ付けとプルを実行してコントロールを更新するためのものです。おそらく、他の誰かが別のことを観察する可能性があります。最終的にCABasicAnimationを使用し、[myView.layer removeAnimationForKey:@ "animationKey"]を呼び出します。

先端@Nickをありがとう-ちょうどヘッドアップリンクは、もはやサポートされるように見えることを、代わりにこれを試してみてくださいません:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/...
trdavidson

)(view.layer.removeAllAnimations後に再度アニメーションビューを追加動作していない
Bunthoeun

52

iOS 10の場合、UIViewPropertyAnimatorを使用してアニメーション化します。UIViewアニメーションを開始、停止、一時停止するメソッドを提供します。

 let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
        self.view.alpha = 0.0
 }
 // Call this to start animation.
 animator.startAnimation()

 // Call this to stop animation.
 animator.stopAnimation(true)

3

ニックの答えに、removeAllAnimationsをスムーズにするために、次のアイデアが非常に便利であると付け加えたいと思います。

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];

0

あなたはこれを試すことができます(Swiftで):

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

注:必要に応じて、これら2つの呼び出しの間にコードを配置できます。次に例を示します。

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.