很久很久不写博客了…… 一直在忙着搞公司的博客(打个小广告,欢迎关注:),把本身的博客荒废了 >< 可是最近遇到一个奇葩的 UI bug,很是无奈,当时在网上查了半天也没查到,因此在这记录一下。bash
iOS 12 发布以后,QA 开始给仓薯源源不断地 assign UI 错乱的 bug。我想这是全部工程师都头疼的问题:几百年没改过的地方,忽然就有人给你报 bug 了。测了一下,发现都是 iOS 12 特有的 bug,初步认定是苹果的锅。具体有如下几种症状:ide
systemLayoutSizeFitting(UILayoutFittingCompressedSize).height)
返回 0。原本 20 多、30 多的 cell 统统返回 0。下面是一个很是简单的 demo,能重现出这类 bug。假设咱们有一个 SimpleCollectionViewCell,顾名思义,它是一个很是简单的 collectionViewCell。里面有个顶天立地的方块,充满这个 cell 的空间。ui
final class SimpleCollectionViewCell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
let squareView = UIView(frame: .zero)
contentView.addSubview(squareView)
squareView.translatesAutoresizingMaskIntoConstraints = false
squareView.heightAnchor.constraint(equalToConstant: 100).isActive = true
squareView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
squareView.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
squareView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
squareView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
复制代码
因此这个 square 的高度为 100,四面 constraint 到 contentView。没什么问题吧?~ 下面咱们用 systemLayoutSizeFitting
来算它的高度:spa
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let measurementCell = SimpleCollectionViewCell(frame: .zero)
let cellWidth = view.frame.width
measurementCell.widthAnchor.constraint(equalToConstant: cellWidth).isActive = true
let size = CGSize(width: cellWidth, height: measurementCell.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height)
print(size)
}
}
复制代码
size 打印出来是多少呢?在 iOS 11 上打印出来 (320, 100)
没问题。在 iOS 12 上打印出来就是 (320, 0)
了。debug
Debug 的过程就懒得吐槽了。本觉得是个很常见的问题,但在网上查了一圈没查到相关的东西,还觉得是本身工程的问题,绕了一圈…… 最后解决方法也很简单:code
contentView
,直接把 subView 加到 cell 上。不用 contentView
在 UITableViewCell
里会有问题,在 collectionView 里彷佛还没发现什么问题。contentView
,须要在 init
里加几行:final class SimpleCollectionViewCell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.topAnchor.constraint(equalTo: topAnchor).isActive = true
contentView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
contentView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
contentView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
let squareView = UIView(frame: .zero)
...
}
}
复制代码
看到这里,这个 bug 的缘由就不言自明了……实在使人无语,为啥 iOS 12 会有这样一个改动呢。 不知道为啥,此前在网上都没有查到相关的内容,所以在这记录一下,但愿能有帮助。rem