“从iOS中排除导航栏”;“安全区”;

“从iOS中排除导航栏”;“安全区”;,ios,autolayout,ios-autolayout,iphone-x,Ios,Autolayout,Ios Autolayout,Iphone X,在我的iOS应用程序中,我在导航栏下呈现视图。这是因为导航栏在用户点击屏幕之前是隐藏的 下面的截图说明了我的问题 “X”按钮呈现在iPhone X的凹口下方,几乎看不见。这就是我将按钮的topAnchor约束到它的superview!。topAnchor 请注意,除iPhone X外,所有设备都可以使用此功能 此屏幕截图中的“X”按钮定位到其superview!。safeAreaLayoutGuide.topAnchor并在导航栏下方呈现。考虑到苹果公司在《安全区域布局指南》上的文档,这是有道

在我的iOS应用程序中,我在导航栏下呈现视图。这是因为导航栏在用户点击屏幕之前是隐藏的

下面的截图说明了我的问题

“X”按钮呈现在iPhone X的凹口下方,几乎看不见。这就是我将按钮的
topAnchor
约束到它的
superview!。topAnchor

请注意,除iPhone X外,所有设备都可以使用此功能

此屏幕截图中的“X”按钮定位到其
superview!。safeAreaLayoutGuide.topAnchor
并在导航栏下方呈现。考虑到苹果公司在《安全区域布局指南》上的文档,这是有道理的:

本指南反映了导航栏、选项卡栏、工具栏和其他上级视图未涵盖的视图部分

但是,我希望“X”按钮呈现在iPhone X的凹口下方和导航栏下方。以下是隐藏导航栏时的外观:

“X”按钮应呈现在槽口正下方

所以我的问题是:

是否有办法将导航栏从视图的
安全区域布局指南中排除?如果没有,除了手动偏移iPhone X上的按钮,我还有什么选择。

请注意,我正在以编程方式完成所有工作。我不再使用故事板


谢谢

这不是答案,而是解决办法:

  • 保留对“X”按钮顶部约束的引用
  • layoutSubviews()
    中,根据“X”的超级视图和窗口
    safeAreaInsets
    更新顶部约束的常数


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

    声明:
    var additionalSafeAreaInsets:UIEdgeInsets{get set}

    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.
    }