从iOS"安全区域排除导航栏"

时间:2018-05-16 07:16:20

标签: ios autolayout ios-autolayout iphone-x

在我的iOS应用中,我在导航栏下方显示了视图。这是因为在用户点击屏幕之前,导航栏是隐藏的。

下面的屏幕截图说明了我的问题。

" X"按钮呈现在iPhone X的缺口下方,几乎看不到。这是我将按钮topAnchor约束到superview!.topAnchor的时候。

  

请注意,这适用于除iPhone X以外的所有设备。

enter image description here

" X"此屏幕截图中的按钮锚定到其superview!.safeAreaLayoutGuide.topAnchor并在导航栏下方呈现。鉴于Apple在safeAreaLayoutGuide上的文档:

,这是有道理的
  

"本指南反映了导航栏,标签栏,工具栏和其他祖先视图未涵盖的视图部分。"

enter image description here

然而,我想要" X"按钮在iPhone X的缺口下方和导航栏下方呈现。这是隐藏导航栏时的样子:

enter image description here

" X"按钮应该在凹槽下面呈现。

所以我的问题是:

有没有办法从视图safeAreaLayoutGuide中排除导航栏?如果没有,除了手动抵消iPhone X上的按钮之外,还有什么选择。

  

请注意,我以编程方式执行所有操作。我不再使用故事板了。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以通过添加其他插图来更改视图控制器的安全区域插图。 创建一个UIEdgeInsetsMake()对象,在其中从顶部插图中减去导航栏的高度。然后将其添加到视图控制器additionalSafeAreaInsets

声明:var additionalSafeAreaInsets: UIEdgeInsets { get set }

答案 1 :(得分:-1)

这不是答案,而是一种解决方法:

  1. 保留对“X”按钮顶部约束的引用。
  2. layoutSubviews()中,根据“X”的超级视图和窗口safeAreaInsets更新顶部约束的常量。
  3. override func layoutSubviews() {
        // To support devices with a "safe area". If the receiver has a top safe area, position
        // the close button beneath the _window's_ safe area.
        // Note that using the receiver's safe area does not work in this case because it includes
        // the navigation bar. We want to render the close button beneath the navigation bar.
    
        let windowSafeAreaInsets = UIApplication.shared.keyWindow!.safeAreaInsets
    
        // Only use the safe area if the receiver _and_ window have a top safe area. This handles
        // the case of non-safe area devices using a hidden navigation bar.
        closeButtonTopConstraint.constant = safeAreaInsets.top > 0 && windowSafeAreaInsets != .zero
                ? windowSafeAreaInsets.top : 16
    
        // Possibly do something similar for landscape and the "X" button's trailing constraint.
    }