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的主要内容,如果未能解决你的问题,请参考以下文章
Swift iOS以编程方式在导航栏下方设置scrollView约束