当titleView具有约束时,backBarButtonItem在iOS 10上变得可见

时间:2016-11-22 18:37:30

标签: ios ipad uisplitviewcontroller uibarbuttonitem ios10

在iOS 10上有一个非常奇怪的行为。假设你有一个空的应用程序,使用Master-Detail Application模板创建。将任何UIView作为titleView放置在navigationBar中以获取详细视图控件。将任何UIView放置到右侧栏按钮项目。 sample configuration screenshot

然后,将该代码写入configureView方法:

if let item = self.splitViewController?.displayModeButtonItem {
    self.navigationItem.leftBarButtonItem = item
    self.navigationItem.leftItemsSupplementBackButton = true
}

然后配置splitviewcontroller preferredDisplayMode = .allVisible,以便displayModeButtonItem出现。

在iOS 9及更低版本中,这会产生标准行为:详细视图控制器会在左侧显示displayModeButtonItem展开按钮。

collapsed state

当用户点击它时,图标会变为箭头。点击箭头可以反转按钮状态。

expanded state

在iOS 10上displayModeButtonItem显示为展开按钮,但如果用户点按它,它就会消失。

displayModeButtonItem dissapeared

同时,按钮仍然存在,用户可以再次点击它。之后,再次显示displayModeButtonItem,展开图标 backButtonItem图标。就像我们将另一个视图控制器推送到详细信息的navigationcontroller上时所显示的那样:

displayModeButtonItem and 2 icons

但在这种情况下,两个图标都充当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)
    }
}

0 个答案:

没有答案