我使用的是UICollectionView和AutoSizing单元,它看起来类似于UITableView。
正如在前面的问题中所提到的:q1,采用自调整单元的q2需要在systemLayoutSizeFitting(_ targetSize:)的帮助下实现preferredLayoutAttributesFitting(_:)方法来实现尺寸调整。
然而,在最近的WWDC会话(高性能自动布局)中,有人提到,使用systemLayoutSizeFitting(_ targetSize:)是昂贵的,因为它创建了一个新的AutoLayout引擎,需要它解决所有的约束,而不缓存先前计算的结果。
在我的应用程序中,我按照答案中提出的方式实现了自我调整。然而,在类似于表的列表中,滚动性能非常糟糕(许多行都是小高度)。
显然,在一个systemLayoutSizeFitting(_ targetSize:)中调用UICollectionViewCell仅仅是为了计算它的大小是昂贵的,而且对CPU来说很费钱(因为大小估计和实际布局都发生在主线程上)。
同时取得下列结果的建议方法是什么?
UICollectionView Width minus marginsAutoSizing单元和高滚动性能的推荐策略是什么?
发布于 2018-06-12 07:58:06
通过向基类添加宽度约束来修正。因为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方法是在视图被添加到层次结构之后调用的。
https://stackoverflow.com/questions/50799447
复制相似问题