在iOS 10上有一个非常奇怪的行为。假设你有一个空的应用程序,使用Master-Detail Application模板创建。将任何UIView
作为titleView放置在navigationBar中以获取详细视图控件。将任何UIView
放置到右侧栏按钮项目。
然后,将该代码写入configureView
方法:
if let item = self.splitViewController?.displayModeButtonItem {
self.navigationItem.leftBarButtonItem = item
self.navigationItem.leftItemsSupplementBackButton = true
}
然后配置splitviewcontroller preferredDisplayMode = .allVisible
,以便displayModeButtonItem
出现。
在iOS 9及更低版本中,这会产生标准行为:详细视图控制器会在左侧显示displayModeButtonItem
展开按钮。
当用户点击它时,图标会变为箭头。点击箭头可以反转按钮状态。
在iOS 10上displayModeButtonItem
显示为展开按钮,但如果用户点按它,它就会消失。
同时,按钮仍然存在,用户可以再次点击它。之后,再次显示displayModeButtonItem
,展开图标和 backButtonItem图标。就像我们将另一个视图控制器推送到详细信息的navigationcontroller上时所显示的那样:
但在这种情况下,两个图标都充当displayModeButtonItem
。
这是iOS错误还是错误配置?我该怎么做才能获得正常的按钮行为?
编辑:我发现,如果titleView(rightBarButtonItem' s视图)不包含对其子视图的任何约束,那么一切都按预期工作。在此上提交了radar。
编辑2:某些控件(如UIImageView)可能会隐式添加NSContentSizeLayoutConstraint
,因此,为了防止此行为(并防止上述错误),请将其子类化并覆盖intrinsicContentSize
方法,如下所示:
private class NoConstraintsUIImageView: UIImageView {
private override func intrinsicContentSize() -> CGSize {
// prevent implicit NSContentSizeLayoutConstraint adding in updateConstraints
return CGSize(width: UIViewNoIntrinsicMetric, height: UIViewNoIntrinsicMetric)
}
}