您需要计算内容的大小CollectionViewCell
并将其返回给sizeForItemAt
函数。
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// Create an instance of the `FooCollectionViewCell`, either from nib file or from code.
// Here we assume `FooCollectionViewCell` is created from a FooCollectionViewCell.xib
let cell: FooCollectionViewCell = UINib(nibName: "FooCollectionViewCell", bundle: nil)
.instantiate(withOwner: nil, options: nil)
.first as! FooCollectionViewCell
// Configure the data for your `FooCollectionViewCell`
cell.stackView.addArrangedSubview(/*view1*/)
cell.stackView.addArrangedSubview(/*view2*/)
// Layout the collection view cell
cell.setNeedsLayout()
cell.layoutSubviews()
// Calculate the height of the collection view based on the content
let size = cell.contentView.systemLayoutSizeFitting(
CGSize(width: collectionView.bounds.width, height: 0),
withHorizontalFittingPriority: UILayoutPriorityRequired,
verticalFittingPriority: UILayoutPriorityFittingSizeLevel)
return size
}
有了这个,你将有一个动态的 cell heights UICollectionView
。
进一步说明:
对于集合视图单元格的配置,您可以创建一个辅助函数func configure(someData: SomeData)
,FooCollectionViewCell
以便在cellForItemAt
函数和sizeForItemAt
函数之间共享代码。
// Configure the data for your `FooCollectionViewCell`
cell.stackView.addArrangedSubview(/*view1*/)
cell.stackView.addArrangedSubview(/*view2*/)
对于这两行代码,似乎只有在UICollectionViewCell
包含垂直UIStackView
作为子视图时才需要(可能是来自 Apple 的错误)。
// Layout the collection view cell
cell.setNeedsLayout()
cell.layoutSubviews()