导航栏中的 UIButton 无法识别 iOS 11 中的点击

Posted

技术标签:

【中文标题】导航栏中的 UIButton 无法识别 iOS 11 中的点击【英文标题】:UIButton in Navigation Bar Not Recognizing Taps in iOS 11 【发布时间】:2017-09-19 17:45:40 【问题描述】:

我在位于UIImageUILabel 顶部的导航栏中有一个UIButton。它在 ios 10 中运行良好,但现在在 iOS 11 中它无法识别来自我的@IBAction 插座的任何水龙头。

我尝试将水龙头出口移动到条形按钮项目,但这也不起作用。 UIButton 具有以下约束:

我通过给它一个绿色背景来确认它在那里,所以我知道它是可见且可用的。

知道发生了什么吗?

【问题讨论】:

与 UIBarButtonItem 相同的问题 :( 尝试找到解决方案... 【参考方案1】:

我从其他开发人员那里找到了解决方案。

您必须向视图添加宽度和高度约束,以将您的所有内容包装在条形按钮项内。所以在我的例子中,标记为View 的项目需要约束。

这是怎么做的:

第 1 步

View 创建一个@IBOutlet 到具有此导航栏的视图控制器。

@IBOutlet weak var myView: UIView!

第 2 步

在包含视图控制器的 viewDidLoad() 内添加约束:

myView.widthAnchor.constraint(equalToConstant: 63).isActive = true
myView.heightAnchor.constraint(equalToConstant: 33).isActive = true

之后,一切都像以前一样。

【讨论】:

是的,它对我有用。为添加到条形按钮项的所有视图设置约束是解决此问题的技巧 这也适用于您在 navigationItem 的 titleView 中放置按钮的类似情况。非常不直观,但谢谢! 当您在 Xcode 中检查调试视图层次结构时 - 如果您在自定义导航项中看不到包含元素(按钮或视图)的视图,那么此修复程序应该可以解决您的问题。至少它对我有用。【参考方案2】:

添加到 Clifton Labrum,这是要走的路。 Apple 改变了 iOS 11 中导航栏的工作方式。 这也可以在 Storyboard 中完成,但要通过后代约束。

UIBarButtonItem 内的自定义视图不能直接给定约束。相反,为其子视图提供约束,自定义视图将隐式获取其约束:

由于这些限制,自定义视图将隐式获取其大小。

这应该可以解决由 iOS 11 引起的所有奇怪行为。

【讨论】:

这是一个很好的选择,不需要任何代码。谢谢!【参考方案3】:

这很疯狂,但是: 在我的情况下,我有带有 NavBarItems 的自定义 NavBar(在我的情况下是右按钮)和 IMPORTANT:以编程方式添加了 UITapGestureRecognizer(用于在文本字段周围点击键盘时关闭键盘):

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
view.addGestureRecognizer(tap)

在 iOS 10.3 上 - 一切正常......在 11 上 - 我只有“点击”动作......所以当我关闭 TapGestureRecognizer - NavBar 上的动作开始工作......

所以,如果您的屏幕上有一些手势 - 请尝试将其删除...

希望对你有帮助

【讨论】:

以上是关于导航栏中的 UIButton 无法识别 iOS 11 中的点击的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 prefersLargeTitles 以 uibutton 作为标题

如何在 iOS 的导航栏中添加标准信息按钮?

无法在故事板iOS8的导航栏中添加右栏按钮

IOS - 垂直对齐导航栏中的后退按钮

导航栏中的 iOS 搜索栏

ios11:导航栏中的 UISearchBar