我的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
}
}
welcomeViewWidthConstant
和welcomeViewHeightConstant
是视图的高度和宽度限制,在Firebase响应之前不可见。
同样,上述内容在iOS 11.0中运行良好
如何在iOS 11.0.1及更高版本中设置约束(基于设备大小)?
答案 0 :(得分:0)
我假设welcomeViewWidthConstant是你声明的一个插座! (隐式解开)。
如果是这样,我会查看正在调用它的堆栈跟踪 - 是否可能未加载视图?
添加
guard let self.isViewLoaded else { return }
到函数顶部
但是,我也认为你会改变didLayout中的约束是很奇怪的。我希望您在Firebase返回时调用setNeedsUpdateConstraints
(可能会移至主队列),然后覆盖updateConstraints
进行更新。
答案 1 :(得分:0)
伙计们,谢谢你伸出援助之手!我实际上找到了罪魁祸首......在故事板中断开了与约束的连接。所以welcome11WidthConstant和welcomeViewHeightConstant的@IBOutlet实际上是零。什么让我失望的是我的设备不是iPhone 8+尺寸,所以它在裂缝中滑落。