You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现UICollectionView高度随内部cell数量动态调整?

UICollectionView随cell数量动态调整高度实现方案

问题说明

你需要实现UICollectionView高度随内部cell数量动态变化,目前设置固定高度才能正常显示,不设置静态高度时控件会消失。

实现步骤

方案1:手动计算高度更新约束

  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子类,让它自动根据内容高度调整自身大小:

  1. 新建子类文件
import UIKit
class SelfSizingCollectionView: UICollectionView {
    override var contentSize: CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }
    
    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }
}
  1. 修改故事板配置
    在故事板中将sizeCollectionView的类修改为SelfSizingCollectionView,只保留位置约束,不需要设置高度约束即可自动适配高度。

注意事项

  • 手动计算高度时要把行间距、section的上下内边距都纳入计算,避免高度显示不全
  • 使用自计算子类时要注意不要给collectionView添加高度或底部约束,否则会和自动计算的高度冲突

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:39:03