在我的iOS应用中,我在导航栏下方显示了视图。这是因为在用户点击屏幕之前,导航栏是隐藏的。
下面的屏幕截图说明了我的问题。
" X"按钮呈现在iPhone X的缺口下方,几乎看不到。这是我将按钮topAnchor
约束到superview!.topAnchor
的时候。
请注意,这适用于除iPhone X以外的所有设备。
" X"此屏幕截图中的按钮锚定到其superview!.safeAreaLayoutGuide.topAnchor
并在导航栏下方呈现。鉴于Apple在safeAreaLayoutGuide
上的文档:
"本指南反映了导航栏,标签栏,工具栏和其他祖先视图未涵盖的视图部分。"
然而,我想要" X"按钮在iPhone X的缺口下方和导航栏下方呈现。这是隐藏导航栏时的样子:
" X"按钮应该在凹槽下面呈现。
所以我的问题是:
有没有办法从视图safeAreaLayoutGuide
中排除导航栏?如果没有,除了手动抵消iPhone X上的按钮之外,还有什么选择。
请注意,我以编程方式执行所有操作。我不再使用故事板了。
谢谢!
答案 0 :(得分:0)
您可以通过添加其他插图来更改视图控制器的安全区域插图。
创建一个UIEdgeInsetsMake()
对象,在其中从顶部插图中减去导航栏的高度。然后将其添加到视图控制器additionalSafeAreaInsets
。
声明:var additionalSafeAreaInsets: UIEdgeInsets { get set }
答案 1 :(得分:-1)
这不是答案,而是一种解决方法:
layoutSubviews()
中,根据“X”的超级视图和窗口safeAreaInsets
更新顶部约束的常量。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.
}