Ric*_*hiy 5 ios autolayout uicollectionview uicollectionviewcell swift
我正在将UICollectionView与AutoSizing单元格一起使用,其外观类似于UITableView。
正如前面的问题中提到的:q1,q2采用“自动调整大小”单元需要preferredLayoutAttributesFitting(_:)在的帮助下实现应用调整大小的方法systemLayoutSizeFitting(_ targetSize:)。
但是,在最近的WWDC会话(高性能自动布局)中,有人提到使用起来systemLayoutSizeFitting(_ targetSize:)很昂贵,因为它会创建一个新的自动布局引擎,然后将其丢弃,要求它解决所有约束,而不缓存先前计算的结果。
在我的应用中,我已经按照答案中提出的方式实现了自动调整大小。但是,在类似表格的列表(许多小高度的行)中,滚动性能非常糟糕。
显然,呼吁systemLayoutSizeFitting(_ targetSize:)在UICollectionViewCell刚刚计算出它的尺寸是昂贵而费力的CPU(因为规模估计和主线程的实际布局走位都)上。
建议同时实现以下结果的方法是什么
UICollectionView Width minus margins?同时具有AutoSizing单元和高滚动性能的推荐策略是什么?
通过向基类添加宽度约束来修复。由于该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方法是在视图添加到层次结构后调用的。
| 归档时间: |
|
| 查看次数: |
3008 次 |
| 最近记录: |