iOS 11 beta 7上UIBarButtonItem无法点击?

17

在SO上有另一个关于这个问题的提问,但与此无关,因为我认为这与iOS 11的beta版本有关。

我有两个UIButton,它们被分组放在一个UIView中。这个UIView被放置在一个UIBarButtonItem中,整个东西被设置为Left Bar Button Items,使用Interface Builder。

每个按钮点击时,会显示一个弹出菜单,由storyboard触发。

我正在iPad 3上运行iOS 9,使用Xcode 8进行测试,一切正常。

现在我决定在我的iPad Pro 9.7"上运行iOS 11 beta 7进行测试。我使用Xcode 9 beta 6。当我在iPad Pro上运行这个应用程序时,导航栏上所有的按钮都失效了。它们没有响应。现在我尝试使用相同的Xcode 9 beta 6,并在iOS 9的iPad 3上运行该应用程序,所有的工作都很好。

我正在编译iOS 9.1。

按钮甚至不会高亮以确认轻击操作,就像在iOS 9上那样。

iOS 11 beta 7和bar button items有问题吗?

有任何想法吗?


我遇到了类似的问题,发现如果我滑动按钮,它就会发送动作,这是非常奇怪的行为。 - Tom Hall
我已经发现了问题。 - Duck
5个回答

18

我发现使用XCode 8编译的同一份代码在iOS10-11上能够正常工作,但是当我使用XCode 9进行编译时,带有自定义视图的UIBarButtonItem无法响应点击事件。

看起来问题出现的原因是因为从iOS 11开始导航栏使用自动布局而不是处理框架。屏幕上的按钮看起来很好,但似乎技术上它们处于屏幕外。

所以我的解决方法是向我的自定义视图添加自动布局约束。

//my custom view init
let view = MyCustomView()
view.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
let rightButtonItem = UIBarButtonItem(customView: view)

//constraints
let widthConstraint = view.widthAnchor.constraint(equalToConstant: 44)
let heightConstraint = view.heightAnchor.constraint(equalToConstant: 44)

heightConstraint.isActive = true
widthConstraint.isActive = true

//add my view to nav bar 
self.rightBarButtonItem = rightButtonItem

在那之后,自定义右侧栏按钮成功接收了点击。


3
非常好!谢谢!这是苹果永远不会修复的那些错误之一。这是我为将来处理这个漏洞的人留下的一条信息。 - Duck
@SpaceDog 我更新了消息,解决方案仍然有效,错误仍然存在。 - JuicyFruit
这是正确的答案,为什么没有被标记为正确呢?@SpaceDog - Thiha Aung
@ThihaAung - 因为被接受的解决方案是唯一一个解决我的情况的。 - Duck

4
我发现了问题!惊人的错误!
以下是解决方法。我正在通过以下步骤将两个按钮添加到左侧导航项:
1. 创建一个视图 2. 在该视图中添加两个UIButtons。 3. 将该视图添加到左侧导航项。
这是为iOS 9编译的,可以在iOS 10及以下版本的设备上运行,但无法在iOS 11上运行。
正确的做法是:
1. 将一个UIButton拖到左侧导航项。 2. 将另一个UIButton拖到左侧导航项。
您会发现iOS允许这样做,并将管理“导航项”下的两个按钮。
这将适用于我测试过的所有iOS版本,从9到11。

2
这并不能解决问题,因为有人可能会在 UIBarButtonItem 中使用除了一些按钮以外的自定义视图。因此,“正确”的(至少是可行的)解决方案是对你的视图设置一个约束(宽度和高度)。这可以在 viewDidLoad 中手动完成。请参见 andreylanadelrey 的答案。 - coyer

4

我通过在UIBarButtonItem中添加以下方法使其正常工作:

[self.barBTNItem setWidth:44];

it makes sense. Thanks. - Duck

2

let tap:

UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(manualAdd.dismissKeyboard))  
tap.cancelsTouchesInView = false  // this line is required for xcode 9  
view.addGestureRecognizer(tap)  

1
Did not fix my issue. - Harsh
它也不能修复我的问题。 - Mansuu....

0

当我升级到iOS 11时,我遇到了同样的问题。

包含按钮的UIView的大小为0x0。

我在Interface Builder中修复了UIView的高度和宽度,之后它就正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接