iOS。做一个布局约束,粘贴到状态栏底部+ X,不管导航栏

问题描述:

我有一堆视图控制器,布局略有不同,但对顶部UILabel的垂直位置有相同的要求。状态栏始终为X(= 70)个单位。这些视图控制器可能被添加到导航控制器与导航栏或不。iOS。做一个布局约束,粘贴到状态栏底部+ X,不管导航栏

我怎样才能做一个比较通用的布局约束考虑到导航栏,所以我的题目是总是从状态栏的X单元不管视图控制器是在导航堆栈或不?

(我知道我可以改变在运行现有约束常量,但是这可能会有点有很多与xibs控制器的问题。我在寻找的东西最好在Interface Builder更通用)

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

为了更加清晰请看照片。

  1. 只能用X单位状态栏状态栏。有一个约束,以安全区域的顶部以恒定X.

1.Status bar only

  1. 状态栏+导航栏。对安全区域的顶部又有一个限制,但是为了得到我想要的结果,我不得不从X中减去navbar.height。常量X - navbar.height。
  2. 2. Status bar + navigation bar

    基本上我寻找的东西,将允许根据导航栏的存在自动调节恒定的约束。也许有可能通过从xib到xib“容易”复制的一些约束来实现这一点。

开始=>

如果在代码中设置这是一个选择,你可以使用这个简单的黑客:

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

所以基本上你就约束到视图的顶部(跳过topLayoutGuide和安全区指南)至常数加上状态栏的高度。

需要注意的是,如果你允许横向模式,或有意见了状态栏被隐藏,你就必须添加更多的代码来处理这些情况。

+0

Self.view.topAnchor是窗口的最高点吗?根据苹果公司的文档:“使用这个锚来创建视图顶部边缘的约束条件。”我假设视图的顶部边缘与窗口的顶部边缘不一样。嗯,很好的问题也是,如果我能做到'.topAnchor.constraint(equalTo:self.view.window .topAnchor,...' – iur

+0

我从来没有见过约束窗口,但它可能是一个办法.. –

+0

@ IUR如果答案是有帮助的,可以请你无论如何接受吗? –