2

アプリに 2 つのボタンがあり、それぞれがアニメーションを開始するとします (例: プッシュまたはその他の標準的なセグエまたはカスタム アニメーション)。ユーザーが両方のボタンを「同時に」押した場合に、両方のアニメーションが同時に発生しないようにするにはどうすればよいですか? さて、最初に試しました:

[[viewController view] setUserInteractionEnabled:NO];

しかし、これで問題は解決しません。(多分userInteractionEnabledすぐにサブビューにカスケードされませんか?)

それから私は試しました:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

これで問題は解決しますが、両方のボタンを 1 つずつすばやく押すと (基本的には 2 本の指で両方を同時に押す)、両方のアニメーションが発生し、アプリに問題が発生します。実行するコードが呼び出される前に、両方のイベントがすでにトリガーされている可能性がありますか?-beginIgnoringInteractionEvents

他のタップイベントをすぐに停止する信頼できる方法は何ですか? または、すでに開始しているものを洗い流します。アプリ全体でこの問題が発生しています.2つのボタンを押す(または表のセルをタップするなど)と、2つのイベントがすぐにトリガーされ、アニメーションが台無しになります。

何か案は?iOS アプリでこの問題に対して人々は何をしていますか?

4

1 に答える 1

1

デバイスの応答性を確保するために、iOS ではタッチ処理が非同期で行われます。beginIgnoringInteractionEventsこれは、ハンドラーが実行される前にキューに入れられる可能性があることを意味します。これが、への呼び出しが無視される理由です。

最も簡単な解決策は、単純にグローバル変数を作成して、相互作用を自分だけのものにすることです。

@interface UIApplicaiton(AnimationsInProgress)

- (BOOL)isAnimationInProgress;
- (void)setAnimationInProgress:(BOOL)value;

@end

そして実装:

@implementation UIApplication(AnimationsInProgress)
{
    BOOL _isAnimationInProgress;
}

- (BOOL)isAnimationInProgress {
    return _isAnimationInProgress;
}

- (void)setAnimationInProgress:(BOOL)value {
    _isAnimationInProgress = value;
}

beginIgnoringInteractionEventsアニメーション アクションの上部で、ほぼ同じように使用します。

if ([[UIApplication sharedApplication] isAnimationInProgress)
    return;
[[UIApplication sharedApplication] setAnimationInProgress:YES];

[UIView animate .... completion:^{
    [[UIApplication sharedApplication] setAnimationInProgress:NO];
}];

タッチ イベントや のような競合状態がないbeginIgnoringInteractionEventsため、これは目的にかなうものです。

于 2013-03-25T17:48:29.567 に答える