在viewDidLayoutSubviews

时间:2017-10-26 18:41:35

标签: ios swift autolayout ios11 viewdidlayoutsubviews

我的ViewController中有几个最初隐藏的UIViews。一旦我从Firebase获得成功回复,它们就会被取消隐藏。这些最初隐藏的视图具有约束(来自Storyboard),我根据设备大小在viewDidLayoutSubviews()中修改。

直到iOS 11.0,这完美无缺。完美=观点仍然隐藏。 Firebase返回一个值后,视图就会被取消隐藏,并且根据我在viewDidLayoutSubviews()中设置的约束,视图大小正确。

从iOS 11.0.1开始,我现在在viewDidLayoutSubviews()崩溃了。

fatal error: unexpectedly found nil while unwrapping an Optional value

以下是viewDidLayoutSubviews()中导致 iOS 11.0.1及更高版本崩溃的代码。

override func viewDidLayoutSubviews() {
    if UIScreen.main.bounds.size.height == 736 { // iPhone 8+
        welcomeViewWidthConstant.constant = 160.0
        welcomeViewHeightConstant.constant = 160.0
    }
}

welcomeViewWidthConstantwelcomeViewHeightConstant是视图的高度和宽度限制,在Firebase响应之前不可见。

同样,上述内容在iOS 11.0中运行良好

如何在iOS 11.0.1及更高版本中设置约束(基于设备大小)?

2 个答案:

答案 0 :(得分:0)

我假设welcomeViewWidthConstant是你声明的一个插座! (隐式解开)。

如果是这样,我会查看正在调用它的堆栈跟踪 - 是否可能未加载视图?

添加

guard let self.isViewLoaded else { return }

到函数顶部

但是,我也认为你会改变didLayout中的约束是很奇怪的。我希望您在Firebase返回时调用setNeedsUpdateConstraints(可能会移至主队列),然后覆盖updateConstraints进行更新。

答案 1 :(得分:0)

伙计们,谢谢你伸出援助之手!我实际上找到了罪魁祸首......在故事板中断开了与约束的连接。所以welcome11WidthConstant和welcomeViewHeightConstant的@IBOutlet实际上是零。什么让我失望的是我的设备不是iPhone 8+尺寸,所以它在裂缝中滑落。