AutoSizingCells preferredLayoutAttributes拟合性能[WWDC 2018]

Ric*_*hiy 5 ios autolayout uicollectionview uicollectionviewcell swift

我正在将UICollectionView与AutoSizing单元格一起使用,其外观类似于UITableView。

正如前面的问题中提到的:q1q2采用“自动调整大小”单元需要preferredLayoutAttributesFitting(_:)在的帮助下实现应用调整大小的方法systemLayoutSizeFitting(_ targetSize:)

但是,在最近的WWDC会话(高性能自动布局)中,有人提到使用起来systemLayoutSizeFitting(_ targetSize:)很昂贵,因为它会创建一个新的自动布局引擎,然后将其丢弃,要求它解决所有约束,而不缓存先前计算的结果。

在我的应用中,我已经按照答案中提出的方式实现了自动调整大小。但是,在类似表格的列表(许多小高度的行)中,滚动性能非常糟糕。

显然,呼吁systemLayoutSizeFitting(_ targetSize:)UICollectionViewCell刚刚计算出它的尺寸是昂贵而费力的CPU(因为规模估计和主线程的实际布局走位都)上。

建议同时实现以下结果的方法是什么

  1. 无停顿的滚动UICollectionView
  2. 使像元的宽度固定并等于UICollectionView Width minus margins

同时具有AutoSizing单元和高滚动性能的推荐策略是什么?

Ric*_*hiy 0

通过向基类添加宽度约束来修复。由于该preferredLayoutAttributesFitting方法仅用于更新首选宽度。

updateConstraints在集合滚动期间不会每次都调用该方法,这可以防止约束流失:

import UIKit
import SnapKit

class AutoSizingCellBase: UICollectionViewCell {
  override class var requiresConstraintBasedLayout: Bool {
    return true
  }

  private var widthConstraint: Constraint?

  override func updateConstraints() {
    if widthConstraint == nil {
      if let window = window {
        let width = window.bounds.width - 16
        contentView.snp.makeConstraints { (make) in
          widthConstraint = make.width.equalTo(width).constraint
        }
      }
    }
    super.updateConstraints()
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,还可以将单元格限制为 ,superview因为该updateConstraints方法是在视图添加到层​​次结构后调用的。