2

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

[[viewController view] setUserInteractionEnabled:NO];

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

然后我尝试了:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

这确实解决了这个问题,除非你一个接一个地快速按下两个按钮基本上用两个手指同时按下两个按钮),那么你会同时发生两个动画,这会导致我的应用出现问题。也许在我要运行的代码被调用之前,这两个事件都已经触发了-beginIgnoringInteractionEvents

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

有任何想法吗?人们对 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 回答