如何确保只响应用户输入运行一个操作?

时间:2013-03-25 13:06:40

标签: ios cocoa-touch

假设某个应用有两个按钮,每个按钮都会启动一个动画(例如推送或其他标准的segue或自定义动画)。如果用户“同时按下”两个按钮,如何阻止两个动画同时发生?好吧,首先我尝试了:

[[viewController view] setUserInteractionEnabled:NO];

但这并不能解决问题。 (也许userInteractionEnabled不会立即级联到子视图?)

然后我尝试了:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

哪个可以解决问题,除了,如果你快速按下非常两个按钮,一个接一个(基本上用两个手指同时按两个按钮),然后你会发现两个动画都会导致我的应用出现问题。可能在我的代码运行-beginIgnoringInteractionEvents之前已经触发了两个事件?

立即停止任何其他点击事件的可靠方法是什么?或者冲掉已经开始的那些。我的应用程序遍布此问题 - 按下两个按钮(或点击表格单元格等)会很快触发两个事件并混乱动画。

有什么想法吗?人们在iOS应用程序中对此问题做了什么?

1 个答案:

答案 0 :(得分: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那样的竞争条件,这将适用于您的目的。