IOS。无论导航栏如何,都进行布局约束以粘合到状态栏底部 + X

Posted

技术标签:

【中文标题】IOS。无论导航栏如何,都进行布局约束以粘合到状态栏底部 + X【英文标题】:iOS. Make a layout constraint to glue to status bar bottom + X regardless of navigation bar 【发布时间】:2017-09-15 15:58:46 【问题描述】:

我有一堆视图控制器,它们的布局略有不同,但对顶部 UILabel 的垂直位置有相同的要求。状态栏始终为 X(=70) 个单位。这些视图控制器可能会添加到带有导航栏的导航控制器中。

如何制作一个相对通用的布局约束来考虑导航栏,这样无论视图控制器是否在导航堆栈中,我的标题始终是状态栏的 X 个单位?

(我知道我可以在运行时更改现有约束的常量,但这对于许多带有 xibs 的控制器来说可能有点问题。我正在寻找更通用的东西,最好在接口构建器中)

我正在使用带有安全区域指南的 ios 11 SDK。

请查看图片以获得更清晰的信息。

    状态栏只有 X 个单位到状态栏。安全区顶部有一个约束,X 为常数。

    状态栏+导航栏。安全区域的顶部再次受到限制,但这次为了得到我想要的结果,我必须从 X 中减去 navbar.height。常量 X - navbar.height。

基本上,我会寻找可以根据导航栏的存在自动调整约束常数的东西。也许有可能通过几个可以“轻松”从 xib 复制到 xib 的约束来实现这一点。

【问题讨论】:

【参考方案1】:

如果您可以选择在代码中设置它,您可以使用这个简单的技巧:

topLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: UIApplication.shared.statusBarFrame.height + 70).isActive = true

所以基本上你将它限制在视图的顶部(跳过 topLayoutGuide 和安全区域指南)到常量加上状态栏的高度。

请注意,如果您允许横向模式,或者存在隐藏状态栏的视图,则必须添加更多代码来处理这些情况。

【讨论】:

self.view.topAnchor 是窗口的最高点吗?根据 Apple 文档:Use this anchor to create constraints with the view’s top edge. 我会假设视图的顶部边缘与窗口的顶部边缘不同。嗯,很好的问题是我是否可以这样做.topAnchor.constraint(equalTo: self.view.window!.topAnchor, ... @iur 如果回答对您有帮助,您能接受吗? 它很有用,我已经投了赞成票,但不幸的是它没有回答这个问题,所以我不能接受它是正确的。

以上是关于IOS。无论导航栏如何,都进行布局约束以粘合到状态栏底部 + X的主要内容,如果未能解决你的问题,请参考以下文章

启用自动布局的 iOS 调整视图大小

Swift iOS以编程方式在导航栏下方设置scrollView约束

自动布局中导航栏下方的文本

xib 中的自动布局 - 子视图的高度与导航栏和标签栏之间的空间成正比

iOS导航栏和状态栏

在导航栏iOS 11安全区域下定位视图