我需要在用户点击按钮后立即禁用与其他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。 我假设,如果此事件是单次触摸或多次触摸事件(例如双击),则等待几毫秒来确定,但我无法弄清楚如何处理此事。
用户点按此按钮后,我该怎么做才能立即禁用用户互动?
答案 0 :(得分:2)
UIAlertView
的外观应阻止用户进一步互动。但是,你要说的是,有一个非常短的窗口(“几毫秒”是一个微小延迟,只要用户感知它),用户可以触摸其他按钮,并导致奇怪的行为。好的,没有测试,我会认为这是真的。
执行此操作的一种相当强力的方法是在相关按钮上将exclusiveTouch
设置为YES
。有关完整说明,请参阅Event Handling Guide。基本上,当exclusiveTouch
属性为YES
的视图正在跟踪触摸时,其他任何视图都无法跟踪触摸。同样,除非没有其他视图跟踪触摸,否则此类视图可能无法开始跟踪触摸。
旁注:我认为您正在使用dispatch_after
来阻止主队列。通常,如果您打算在主队列上放置一些东西以立即执行,那么您只需使用dispatch_async
。
编辑:当提出此问题时,它未指定使用UIBarButtonItem
。此答案仅适用于UIView
或其后代。