AutolayoutとUICollectionViewでAutoSizingセルを使用しています。
セルの初期化に関するコードで制約を指定できます。
func configureCell() {
snp.makeConstraints { (make) in
make.width.equalToSuperview()
}
}
ただし、セルがcollectionView
にまだ追加されていないため、アプリがクラッシュします。
質問
cell
のライフサイクルのどの段階でcell
のwidth
を使用して制約を追加できますか?
cell
'swidthequal to the
widthof the
collectionViewwithout accessing an instance of
UIScreen or
UIWindow`を作成するデフォルトの方法はありますか?
編集セルの自動サイズ設定機能の使用方法に関するものではないため、質問は重複していませんが、セルのライフサイクルのどの段階で制約を適用して目的の結果を達成するかいつ = AutoLayoutでの作業。
セルフサイジングコレクションビューセルを実装するには、次の2つのことを行う必要があります。
estimatedItemSize
にUICollectionViewFlowLayout
を指定しますpreferredLayoutAttributesFitting(_:)
を実装するestimatedItemSize
でUICollectionViewFlowLayout
を指定するこのプロパティのデフォルト値はCGSizeZeroです。これを他の値に設定すると、コレクションビューは、セルのpreferredLayoutAttributesFitting(_ :)メソッドを使用して各セルに実際のサイズを問い合わせます。すべてのセルの高さが同じ場合は、このプロパティではなくitemSizeプロパティを使用して、代わりにセルサイズを指定します。
これは単なる見積もりであり、スクロールビューのコンテンツサイズを計算するために使用され、適切な値に設定します。
_let collectionViewFlowLayout = UICollectionViewFlowLayout()
collectionViewFlowLayout.estimatedItemSize = CGSize(width: collectionView.frame.width, height: 100)
_
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
}
_
サイズを計算するには、 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
}
}