gpt4 book ai didi

ios - AutoSizingCells preferredLayoutAttributesFitting 性能 [WWDC 2018]

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:00 25 4
gpt4 key购买 nike

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

如前几个问题所述:q1 , q2采用 Self-Sizing 单元格需要实现 preferredLayoutAttributesFitting(_:) 方法,以便在 systemLayoutSizeFitting(_ targetSize:) 的帮助下应用尺寸调整。

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

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

很明显,在 UICollectionViewCell 中调用 systemLayoutSizeFitting(_ targetSize:) 只是为了计算它的大小是昂贵的并且对 CPU 造成负担(因为大小估计和实际布局发生在主线程上)。

同时实现以下结果的推荐方法是什么

  1. 无延迟滚动的 UICollectionView
  2. 使单元格的宽度固定并等于 UICollectionView 宽度减去边距?

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

最佳答案

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

此外,由于 updateConstraints 方法是在 View 添加到层​​次结构之后调用的,因此可以将单元格限制到 superview

关于ios - AutoSizingCells preferredLayoutAttributesFitting 性能 [WWDC 2018],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50799447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com