如何实现UICollectionView高度随内部cell数量动态调整?
UICollectionView随cell数量动态调整高度实现方案
问题说明
你需要实现UICollectionView高度随内部cell数量动态变化,目前设置固定高度才能正常显示,不设置静态高度时控件会消失。
实现步骤
方案1:手动计算高度更新约束
- 调整故事板约束
- 为
sizeCollectionView设置leading、trailing、top位置约束,删除原有固定高度约束 - 为
sizeCollectionView新增高度约束,关联IBOutlet到ProduitViewController中:
@IBOutlet weak var sizeCollectionHeightConstraint: NSLayoutConstraint!

2. 新增高度计算逻辑
在setup方法中,调用reloadData后新增高度计算代码,根据你的布局规则每行显示3个固定高度为35的cell,计算总高度后更新约束:
sizeCollectionView.reloadData() // 新增以下代码 let itemCount = sizeCollectionViewManager?.sizeProduct.count ?? 0 // 每行3个item,向上取整得到总行数 let rowCount = ceil(CGFloat(itemCount) / 3) // 替换为你实际设置的行间距和section上下内边距 let lineSpacing: CGFloat = 10 let sectionInsetTop: CGFloat = 0 let sectionInsetBottom: CGFloat = 0 let totalHeight = rowCount * 35 + (rowCount - 1) * lineSpacing + sectionInsetTop + sectionInsetBottom sizeCollectionHeightConstraint.constant = totalHeight view.layoutIfNeeded()
方案2:使用自计算高度的UICollectionView子类
如果不想手动计算高度,可以自定义UICollectionView子类,让它自动根据内容高度调整自身大小:
- 新建子类文件
import UIKit class SelfSizingCollectionView: UICollectionView { override var contentSize: CGSize { didSet { invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { layoutIfNeeded() return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height) } }
- 修改故事板配置
在故事板中将sizeCollectionView的类修改为SelfSizingCollectionView,只保留位置约束,不需要设置高度约束即可自动适配高度。
注意事项
- 手动计算高度时要把行间距、section的上下内边距都纳入计算,避免高度显示不全
- 使用自计算子类时要注意不要给collectionView添加高度或底部约束,否则会和自动计算的高度冲突
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

