AutoSizing单元格:单元格宽度等于CollectionView

时间:2018-04-02 17:45:50

标签: ios swift uicollectionview autolayout autosize

我正在使用Autolayout和UICollectionView的AutoSizing单元格。

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

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

然而,由于该单元格尚未添加到collectionView,该应用程序崩溃。

问题

  1. cell生命周期的哪个阶段,可以添加一个 约束cell的{​​{1}}?

  2. 是否有任何默认方式可以width cell宽度宽度equal to the collectionView of the UIScreen without accessing an instance of UIWindow`?

  3. 修改 问题不是重复,因为它不是关于如何使用AutoSizing单元格功能,而是在单元格生命周期的哪个阶段应用约束来实现所需的结果 使用AutoLayout时。

2 个答案:

答案 0 :(得分:24)

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

  1. estimatedItemSize
  2. 上指定UICollectionViewFlowLayout
  3. 在您的手机上实施preferredLayoutAttributesFitting(_:)
  4. 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
    }
    

答案 1 :(得分:0)

您需要实施sizeForItemAt:来计算尺寸。

我们还使用了"尺寸调整单元"如果你的细胞高度可变。例如:

class MyFancyCell: UICollectionViewCell {
    class func cellSize(_ content: SomeContent, withWidth width: CGFloat) -> CGSize {
        sizingCell.content = content
        sizingCell.updateCellLayout(width)
        return sizingCell.systemLayoutSizeFitting(UILayoutFittingExpandedSize)
    }

    fileprivate static let sizingCell = Bundle.main.loadNibNamed("ContentCell", owner: nil, options: nil)!.first as! ContentCell    

    func updateCellLayout(width: CGFloat) {
        //Set constraints and calculate size    
    }
}