1. ホーム
  2. iphone

[解決済み] UIViewのブロックベースのアニメーションをキャンセルするには?

2023-04-04 07:27:16

質問

SO や Apple のリファレンスをたくさん探しましたが、私の問題を解決することができません。

私が持っているもの。

  1. 2つの UIImageView と2つの UIButton が接続されている
  2. 2種類のアニメーション
    1. で一度だけ、各画像を次々に拡大・縮小する。 viewDidLoad
    2. ボタンが押されたとき (それぞれの UIImageView の中に隠されたカスタムボタン) が押されると、適切な UIImageView -のみ(スケールアップ、スケールダウンも可能)。
    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 は適切にアニメーションをキャンセルするからです。

EDITです。 私はこの解決策を使用しましたが、まだスケールダウンに問題があります。 smallLetter UIImageView - が全くキャンセルされないという問題があります... 解決策

EDIT2です。 next/prevメソッドの冒頭に追加しました。

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

問題発生...:/ アニメーションチェーンにある文字の最後のアニメーションを中断させる方法がわからない

どのように解決するのですか?

を呼び出すことで、ビューのすべてのアニメーションを停止することができます。

[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