web-dev-qa-db-ja.com

animateWithDuration:animations:はメインスレッドをブロックしますか?

以下の2つのメソッドをUIの別々のボタンに接続しましたが、「バージョン1」ボタンを押した後、メソッド内のアニメーション期間が終了するまでボタンを再度押すことができないことに気付きました。私の理解は、アニメーションがメインアプリケーションをブロックしないように独自のスレッドを使用することでした。

// VERSION 1
-(IBAction)fadeUsingBlock {
    NSLog(@"V1: Clicked ...");
    [myLabel setAlpha:1.0];
    [UIView animateWithDuration:1.5 animations:^{
        [myLabel setAlpha:0.0];
    }];
}

古いスタイルのバージョン(下記)では、アニメーションタイマーが終了する前にボタンを再度押すことができ、タイマーをリセットして再起動するだけです。これらは両方とも同じように機能する必要がありますか、何か不足していますか、それとも3.2と4の間で動作に変更はありますか?

// VERSION 2
-(IBAction)fadeUsingOld {
    NSLog(@"V2: Clicked ...");
    [myLabel setAlpha:1.0];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.5];
    [myLabel setAlpha:0.0];
    [UIView commitAnimations];
}

乾杯ゲーリー

40
fuzzygoat

ブロックでアニメートしてもメインスレッドはブロックされません。あなたが見ている振る舞いは、デフォルトでは、ユーザー操作は新しいブロック呼び出しでの継続時間アニメーションが無効になっているためだと思います。次のように、UIViewAnimationOptionAllowUserInteraction(animationWithDuration:delay:options:animations:completionを呼び出す)を渡すことで、これをオーバーライドできます。

-(IBAction) fadeUsingBlock {
    NSLog(@"V1: Clicked ...");
    [myLabel setAlpha:1.0];
    [UIView animateWithDuration:1.5 
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         [myLabel setAlpha:0.0];
                     }
                     completion:nil];
}
93
zpasternack

AnimateWithDuration:の場合、クラス参照はスレッド化について何も言わないので、わかりません。

ために beginAnimations:context: and commitAnimation:、そう、それらは別のスレッドで実行されます IView class Reference

ビューオブジェクトに対するプロパティの変更の一部は、アニメーション化できます。たとえば、フレーム、境界、中心、および変換プロパティの設定です。アニメーションブロックでこれらのプロパティを変更すると、現在の状態から新しい状態への変更がアニメーション化されます。 beginAnimations:context:クラスメソッドを呼び出してアニメーションブロックを開始し、アニメーション化するプロパティを設定してから、commitAnimationsクラスメソッドを呼び出してアニメーションブロックを終了します。アニメーションは別のスレッドで実行され、アプリケーションが実行ループに戻ると開始されます。他のアニメーションクラスメソッドを使用すると、ブロック内のアニメーションの開始時間、継続時間、遅延、および曲線を制御できます。

1
vodkhang