0

押されたボタンに応じてメイン画面に移行する複数のビューを持つアプリケーションがあります。私の現在の問題は、ビューがアニメーションの途中である場合、ユーザーが別のボタンを選択すると、レイアウト全体が混乱することです。(例:ビューが画面と整列しないため、数ピクセルずれます)

私が知りたいのは、ビューが現在アニメーション化されているかどうかを確認する方法があるかどうかです。その場合は、最後のフレームまでアニメーション化して、その間のものをスキップします。以下は、SOに関する他のユーザーの質問で読んだ内容に基づいてテストしたばかりの小さなコードです。

-(IBAction)buttonPress:(id)sender
{
    if([selectedView.layer.animationKeys count] > 0)
    {
        [selectedView.layer removeAllAnimations];
    }

// Perform other calculations once the animation has stopped
}
4

1 に答える 1

0

これを行うには多くの方法がありますが....

ブロックアニメーションを使用している場合は、アニメーションの開始時に「isAnimating」フラグを設定し、完了ブロックに再度設定できます。どこからでもブール値をチェックし、必要に応じてケースを処理できます。

アニメーションが発生した後に実行するコードが必要な場合については、

// animation code in some method...
[UIView animateWithDuration:1.0
    delay: 0.0
    options: UIViewAnimationOptionCurveEaseIn
    animations:^{
         isAnimating = YES;
         fooView.alpha = 0.0;
    }
    completion:^(BOOL finished){
         isAnimating = NO;
         [[NSNotificationCenter defaultCenter] postNotificationName:@"FooBeDone" object:nil userInfo:nil]
    }];

-(IBAction)buttonPress:(id)sender {
    if (isAnimating) {
         [[NSNotificationCenter defaultCenter] addObserver:self 
                           selector:@selector(doBar:) 
                               name:@"FooBeDone"
                             object:nil];
         // possibly disable button to prevent multiple taps?
    } else {
         [self doBar];
    }
}

- (void)doBar {
     // do what needs to be done when when the animation is over
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"FooBeDone" object:nil];
     // possibly enable button again
}

編集:可能な通知方法を示すためにコードを追加しました。IBActionで拡張ループを作成すると、ループが終了してメインの実行ループに戻ることができるまでユーザーインターフェイスがロックされるため、これを回避することを強くお勧めします。通知は同じ効果をもたらすはずですが、メインの実行ループが妨げられることなく続行できるようにします。

于 2012-04-24T19:50:23.417 に答える