AutoSizingCells preferredLayoutAttributesFitting 性能 [WWDC 2018]

AutoSizingCells preferredLayoutAttributesFitting Performance [WWDC 2018]

我将 UICollectionView 与 AutoSizing 单元格一起使用,它看起来类似于 UITableView。

正如在前面的问题中提到的:q1, 采用 Self-Sizing 单元格需要实施 preferredLayoutAttributesFitting(_:) 方法以在 systemLayoutSizeFitting(_ targetSize:) 的帮助下应用大小调整。

然而,在最近的 WWDC session (High Performance Auto Layout) 中,有人提到,使用 systemLayoutSizeFitting(_ targetSize:) 是昂贵的,因为它创建了一个新的 AutoLayout 引擎,之后会丢弃它,需要它解决所有约束,而不缓存先前计算的结果。

在我的应用程序中,我以答案中建议的方式实现了自我调整大小。然而,滚动性能在 table-like 列表中很糟糕(许多行的高度很小)。

显然,在 UICollectionViewCell 中调用 systemLayoutSizeFitting(_ targetSize:) 只是为了计算它的大小是昂贵的并且对 CPU 征税(因为大小估计和实际布局都发生在主线程)。

同时达到以下结果的推荐方法是什么

  1. 一个stall-free滚动的UICollectionView
  2. 使单元格的宽度固定并等于UICollectionView Width minus margins?

同时拥有自动调整单元格大小和高滚动性能的推荐策略是什么?

已通过向基础添加宽度约束来修复 class。由于 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()
  }
}

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