【发布时间】:2018-01-11 16:36:08
【问题描述】:
在 iOS 11 上,由于标签明显错误地报告了它们的 intrinsicContentSize,我们的许多布局都被破坏了。
当 UILabel 被包裹在另一个试图实现 intrinsicContentSize 本身的视图中时,该错误似乎表现得最严重。像这样(简化和人为的例子):
class LabelView: UIView {
let label = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setup() {
self.label.textColor = .black
self.label.backgroundColor = .green
self.backgroundColor = .red
self.label.numberOfLines = 0
self.addSubview(self.label)
self.label.translatesAutoresizingMaskIntoConstraints = false
self.label.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
self.label.trailingAnchor.constraint(lessThanOrEqualTo: self.trailingAnchor).isActive = true
self.label.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
self.label.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
}
override var intrinsicContentSize: CGSize {
let size = self.label.intrinsicContentSize
print(size)
return size
}
}
UILabel 的intrinsicContentSize 非常有特色,看起来像:(width: 1073741824.0, height: 20.5)。这会导致布局周期为视图的包装器提供太多空间。
这仅在从 XCode 9 为 iOS 11 编译时发生。在 iOS 11 上运行时,在 iOS 10 SDK 上编译(在 XCode 8 上)。
在 XCode 8 (iOS 10) 上,视图正确呈现如下:
在 XCode 9 (iOS 11) 上,视图呈现如下:
带有完整 Playground 代码的 Gist 是 here。
我已经为此提交了一份雷达,并且至少有一个解决该问题的方法(请参阅下面的答案)。我想知道是否有其他人遇到过这个问题或有其他方法可以尝试。
【问题讨论】: