一尘不染

自动调整单元格大小:单元格宽度等于CollectionView

swift

我正在将AutoSizing单元格与Autolayout和UICollectionView一起使用。

我可以在单元初始化的代码中指定约束:

  func configureCell() {
    snp.makeConstraints { (make) in
      make.width.equalToSuperview()
    }
  }

但是,由于该单元尚未添加到中,该应用程序崩溃了collectionView

问题

  1. 在该阶段cell的生命周期,可以添加一个约束cellwidth

  2. 有没有作出任何默认方式cell`宽度equal to the of the的CollectionViewwithout accessing an instance of UIScreenorUIWindow

编辑 这个问题不是重复的,因为它不是关于如何使用AutoSizing单元格功能,而是关于在单元生命周期的哪个阶段应用约束以
使用AutoLayout 获得所需结果的问题。


阅读 261

收藏
2020-07-07

共1个答案

一尘不染

要实现自动调整大小的集合视图单元,您需要做两件事:

  1. 指定estimatedItemSizeUICollectionViewFlowLayout
  2. preferredLayoutAttributesFitting(_:)在您的手机上实施

1.指定estimatedItemSize有关UICollectionViewFlowLayout

此属性的默认值为CGSizeZero。将其设置为任何其他值会使集合视图使用单元格的preferredLayoutAttributesFitting(_
:)方法查询每个单元格的实际大小。如果所有单元格的高度都相同,请使用itemSize属性(而不是此属性)来指定单元格大小。

只是一个估算值 ,用于计算滚动视图的内容大小,并将其设置为合理的值。

let collectionViewFlowLayout = UICollectionViewFlowLayout()
collectionViewFlowLayout.estimatedItemSize = CGSize(width: collectionView.frame.width, height: 100)

2. preferredLayoutAttributesFitting(_:)UICollectionViewCell子类上实现

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)

    // Specify you want _full width_
    let targetSize = CGSize(width: layoutAttributes.frame.width, height: 0)

    // Calculate the size (height) using Auto Layout
    let autoLayoutSize = contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: UILayoutPriority.required, verticalFittingPriority: UILayoutPriority.defaultLow)
    let autoLayoutFrame = CGRect(origin: autoLayoutAttributes.frame.origin, size: autoLayoutSize)

    // Assign the new size to the layout attributes
    autoLayoutAttributes.frame = autoLayoutFrame
    return autoLayoutAttributes
}
2020-07-07