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 征税(因为大小估计和实际布局都发生在主线程)。
同时达到以下结果的推荐方法是什么
- 一个stall-free滚动的UICollectionView
- 使单元格的宽度固定并等于
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
方法是在视图添加到层次结构后调用的。
我将 UICollectionView 与 AutoSizing 单元格一起使用,它看起来类似于 UITableView。
正如在前面的问题中提到的:q1, preferredLayoutAttributesFitting(_:)
方法以在 systemLayoutSizeFitting(_ targetSize:)
的帮助下应用大小调整。
然而,在最近的 WWDC session (High Performance Auto Layout) 中,有人提到,使用 systemLayoutSizeFitting(_ targetSize:)
是昂贵的,因为它创建了一个新的 AutoLayout 引擎,之后会丢弃它,需要它解决所有约束,而不缓存先前计算的结果。
在我的应用程序中,我以答案中建议的方式实现了自我调整大小。然而,滚动性能在 table-like 列表中很糟糕(许多行的高度很小)。
显然,在 UICollectionViewCell
中调用 systemLayoutSizeFitting(_ targetSize:)
只是为了计算它的大小是昂贵的并且对 CPU 征税(因为大小估计和实际布局都发生在主线程)。
同时达到以下结果的推荐方法是什么
- 一个stall-free滚动的UICollectionView
- 使单元格的宽度固定并等于
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
方法是在视图添加到层次结构后调用的。