点击按钮后立即禁用用户与不同UI元素的交互

时间:2014-12-10 12:38:34

标签: ios objective-c uibutton touch-event

我需要在用户点击按钮后立即禁用与其他ui元素的所有用户交互。我想阻止用户一次触发多个动作,例如按下按钮并点击集合视图中的元素或点击UIBackBarButton。

作为示例,我创建了一个调用此方法的UIBarButtonItem,它禁用了self.view和UIBarButtonItems的用户交互,并在1秒后重新启用它们:

- (void)buttonPressed:(id)sender
{
    self.view.userInteractionEnabled = NO;
    self.navigationItem.backBarButtonItem.enabled = NO;
    self.navigationItem.rightBarButtonItem.enabled = NO;

// ... show an alert view

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.view.userInteractionEnabled = YES;
        self.navigationItem.backBarButtonItem.enabled = YES;
        self.navigationItem.rightBarButtonItem.enabled = YES;
    });

}

问题是,如果我几乎同时点击此按钮,例如后退按钮,它会显示警报视图并弹出当前的viewController。 我假设,如果此事件是单次触摸或多次触摸事件(例如双击),则等待几毫秒来确定,但我无法弄清楚如何处理此事。

用户点按此按钮后,我该怎么做才能立即禁用用户互动?

1 个答案:

答案 0 :(得分:2)

UIAlertView的外观应阻止用户进一步互动。但是,你要说的是,有一个非常短的窗口(“几毫秒”是一个微小延迟,只要用户感知它),用户可以触摸其他按钮,并导致奇怪的行为。好的,没有测试,我会认为这是真的。

执行此操作的一种相当强力的方法是在相关按钮上将exclusiveTouch设置为YES。有关完整说明,请参阅Event Handling Guide。基本上,当exclusiveTouch属性为YES的视图正在跟踪触摸时,其他任何视图都无法跟踪触摸。同样,除非没有其他视图跟踪触摸,否则此类视图可能无法开始跟踪触摸。

旁注:我认为您正在使用dispatch_after来阻止主队列。通常,如果您打算在主队列上放置一些东西以立即执行,那么您只需使用dispatch_async

编辑:当提出此问题时,它未指定使用UIBarButtonItem。此答案仅适用于UIView或其后代。