首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoSizingCells preferredLayoutAttributesFitting性能[WWDC 2018年]

AutoSizingCells preferredLayoutAttributesFitting性能[WWDC 2018年]
EN

Stack Overflow用户
提问于 2018-06-11 13:56:59
回答 1查看 7.4K关注 0票数 7

我使用的是UICollectionView和AutoSizing单元,它看起来类似于UITableView。

正如在前面的问题中所提到的:q1,采用自调整单元的q2需要在systemLayoutSizeFitting(_ targetSize:)的帮助下实现preferredLayoutAttributesFitting(_:)方法来实现尺寸调整。

然而,在最近的WWDC会话(高性能自动布局)中,有人提到,使用systemLayoutSizeFitting(_ targetSize:)是昂贵的,因为它创建了一个新的AutoLayout引擎,需要它解决所有的约束,而不缓存先前计算的结果。

在我的应用程序中,我按照答案中提出的方式实现了自我调整。然而,在类似于表的列表中,滚动性能非常糟糕(许多行都是小高度)。

显然,在一个systemLayoutSizeFitting(_ targetSize:)中调用UICollectionViewCell仅仅是为了计算它的大小是昂贵的,而且对CPU来说很费钱(因为大小估计和实际布局都发生在主线程上)。

同时取得下列结果的建议方法是什么?

  1. 无失速滚动UICollectionView
  2. 使单元格的宽度固定并等于UICollectionView Width minus margins

AutoSizing单元和高滚动性能的推荐策略是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-12 07:58:06

通过向基类添加宽度约束来修正。因为preferredLayoutAttributesFitting方法只用于更新首选宽度。

在集合滚动期间,并不是每次都调用updateConstraints方法,这样可以防止约束搅动:

代码语言:javascript
复制
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方法是在视图被添加到层次结构之后调用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50799447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档