web-dev-qa-db-ja.com

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

私は現在、次の問題に焦点を当てています。

2つのオブジェクト-属性がトリガーされるアニメーションを開始します。

コードは次のとおりです。

    [UIView animateWithDuration:0.3 animations:^{
        greyscaleImage.alpha     = 1;
        activityIndicator.alpha  = 1;
    } completion:^(BOOL f){
        if(f)
        {
            [activityIndicator startAnimating];
        }
    }];

これは正常に動作します。

私が発見した唯一の問題は、このactivityIndi​​catorとgreyscaleImageを保持するビューの割り当てが解除されたときに、アプリをクラッシュさせる0.3秒の変更があることです。

より明確にするために、ViewControllerを想像してみてください。そのビューは、デフォルトのiOS-modal-Viewの方法で表示されます。次に、そのアニメーションをトリガーします。これには2分かかります。その2分に達する前に、アニメーションが非常に退屈であることに気付き、そのビューを却下したいとします。これで、ビュー、activityIndi​​cator、およびgreyscaleImageが解放されたため、アニメーションo/cは何をすべきかを知ることができません。

だから私はここで何をすべきか+デバッガがなぜ指すのか疑問に思います

  } completion:^(BOOL f){

たとえばの代わりに[activityIndi​​cator.。

2分が経過する前にユーザーがビューを閉じることができるようにする方法はありますか?

宜しくお願いします

20
thedanielhanke

0.0秒かかり、目的の状態になる新しいアニメーションを開始すると、古いアニメーションがキャンセルされ、新しい(インスタント)「アニメーション」が開始されます。

移動中のビューを既にある場所に移動して停止する場合の例:

[UIView animateWithDuration:0.0
                      delay:0.0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
                 completion:^(BOOL finished){}
 ];

options:UIViewAnimationOptionBeginFromCurrentStateは重要です。これを呼び出さないと、前のアニメーションの終了状態からアニメーションが開始されます。移動中は、停止したい場所にワープする前に、終了位置にワープします。キャンセル-「アニメーション」は瞬時に行われますが、前後のジャンプが表示される場合があります。

注:アニメーション時間は0.0秒である必要はありません。どのアニメーションでも、古いアニメーションはキャンセルされます。ただし、さまざまな種類のアニメーションについては完全にはわかりません。たとえば、フレームを変更するとフェードが止まるかどうかはわかりません。

32
Aberrant

ビューレイヤーからすべてのアニメーションを削除できます

[movingView.layer removeAllAnimations];
7
Chris

アニメーションオプションの設定UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction私のために働きます。

次のように使用します。

[UIView animateWithDuration:0.5
                          delay:0.0
         usingSpringWithDamping:0.7
          initialSpringVelocity:0
                        options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                    // Do your stuff here, like changing the frame etc.
                    self.containerView.frame = CGRectMake(0, 100, 300, 300);
    } completion:nil];
1
atulkhatri

ブロックは開始後に常に完了し、停止することはできません(アプリをクラッシュさせない限り)。代わりに、通知センターまたはNSTimerを使用して手動でフレームを変更することをお勧めします。

1
user850099