如何防止在 UINavigationbar 上同时触摸按钮的双重动作?
Posted
技术标签:
【中文标题】如何防止在 UINavigationbar 上同时触摸按钮的双重动作?【英文标题】:How to prevent double action from simultaneous button touches on UINavigation bar? 【发布时间】:2015-11-04 22:21:19 【问题描述】:在一个 UINavigation 栏中,有一个右侧的自定义共享 UIBarButtonItem 和一个返回按钮在左侧的 UIBarButtonItem。当同时点击两个按钮时,应用会产生黑色视图,这可能是因为两个按钮都试图同时显示一个新视图 - 共享按钮呈现一个 UIActivityViewController,而后退按钮呈现一个来自前一屏幕的 VC。
在这里查看类似问题时,我尝试了以下解决方案,但均未阻止同时触摸按钮时出现黑色视图:
-
通过以下2种方式将
exclusiveTouch
插入ViewDidLoad
一)
for(UIView *temp in self.navigationController.navigationBar.subviews) [temp setExclusiveTouch:YES];
b)
[self.navigationController.navigationBar setExclusiveTouch:YES];
-
触摸后应用
self.navigationController.navigationBar.userInteractionEnabled = NO;
。
还有其他解决方案吗?
这和多线程有关吗?
【问题讨论】:
我遇到了同样的问题。你找到解决方案了吗? @angak 我认为我们所做的是在另一个按钮被触摸后专门禁用它。 【参考方案1】:在每个触摸事件处理程序中,添加以下行:
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
处理程序完成后,执行以下操作:
[[UIApplication sharedApplication] endIgnoringInteractionEvents];
由您决定处理程序结束时要考虑什么。如果您正在推送或弹出视图控制器,则可以将第二行添加到相关视图控制器的 viewWillAppear 中。如果要显示模态视图控制器,则可以使用 -[UIViewController presentViewController:animated:completion:]
的完成处理程序。
【讨论】:
【参考方案2】:在这种情况下,您可以使用 ExclusiveTouch 属性非常简单
[self.navigationController.navigationBar setExclusiveTouch:YES];
这是一个布尔值,指示接收器是否专门处理触摸事件。
将此属性设置为 YES 会导致接收器阻止将触摸事件传递到同一窗口中的其他视图。此属性的默认值为 NO。
【讨论】:
但尝试触摸导航栏按钮上方的状态栏。在这种情况下,导航栏按钮被按下。真奇怪。【参考方案3】:如果您希望一次只有一个按钮响应触摸,则需要为该按钮设置exclusiveTouch
,而不是为父视图设置。
在添加条形按钮项之后放置它。
for(UIView *temp in self.navigationController.navigationBar.subviews)
[temp setExclusiveTouch:YES];
或者您可以在创建 UIBarButton
时为每个 UIBarButton
单独设置它们。
【讨论】:
感谢 PiyushSharma。这是我尝试的第一件事——忘记了——谢谢你提醒我。此外,UIBarButtons 没有 ExclusiveTouch 属性。 我在 swift 代码中做了同样的事情,但没有工作......你能告诉我怎么做......提前谢谢以上是关于如何防止在 UINavigationbar 上同时触摸按钮的双重动作?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止黑色背景出现在我的UINavigationBar中?
如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?
防止 iOS 7 UINavigationBar 使用 UIAppearance 为 barTintColor 更改设置动画
防止 UISearchBarController 显示 UINavigationBar