web-dev-qa-db-ja.com

セルの自動サイズ設定:CollectionViewと等しいセル幅

AutolayoutとUICollectionViewでAutoSizingセルを使用しています。

セルの初期化に関するコードで制約を指定できます。

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

ただし、セルがcollectionViewにまだ追加されていないため、アプリがクラッシュします。

質問

  1. cellのライフサイクルのどの段階でcellwidthを使用して制約を追加できますか?

  2. cell 'swidthequal to the widthof thecollectionViewwithout accessing an instance of UIScreen orUIWindow`を作成するデフォルトの方法はありますか?

編集セル​​の自動サイズ設定機能の使用方法に関するものではないため、質問は重複していませんが、セルのライフサイクルのどの段階で制約を適用して目的の結果を達成するかいつ = AutoLayoutでの作業。

7
Richard Topchii

セルフサイジングコレクションビューセルを実装するには、次の2つのことを行う必要があります。

  1. estimatedItemSizeUICollectionViewFlowLayoutを指定します
  2. セルにpreferredLayoutAttributesFitting(_:)を実装する

1. estimatedItemSizeUICollectionViewFlowLayoutを指定する

このプロパティのデフォルト値はCGSizeZeroです。これを他の値に設定すると、コレクションビューは、セルのpreferredLayoutAttributesFitting(_ :)メソッドを使用して各セルに実際のサイズを問い合わせます。すべてのセルの高さが同じ場合は、このプロパティではなくitemSizeプロパティを使用して、代わりにセルサイズを指定します。

これは単なる見積もりであり、スクロールビューのコンテンツサイズを計算するために使用され、適切な値に設定します。

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

2. UICollectionViewCellサブクラスにpreferredLayoutAttributesFitting(_:)を実装します

_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
}
_
35
Oliver Atkinson

サイズを計算するには、 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    
    }
}
0
skwashua