如何根据内部固定高度cell的数量自动设置UITableView的高度?
固定cell高度下UITableView自适应cell数量高度实现方案
以下方案均基于cell高度固定的前提,不需要开启cell高度自适应相关配置,直接调整UITableView本身的高度。
方案1:手动管理高度约束(适配绝大多数场景,推荐)
- 先给UITableView在布局中添加高度约束,将该约束关联到代码中的变量,比如命名为
tableViewHeightConstraint - 定义好你的单个cell固定高度常量,比如
let fixedCellHeight: CGFloat = 50 - 每次从API获取到数据源、刷新tableView之前,重新计算高度并更新约束:
// Swift 示例 // dataArray为你的tableView数据源数组 let totalHeight = CGFloat(dataArray.count) * fixedCellHeight // 如果你有固定高度的section header/footer,需要把对应高度也加上 // let totalHeight = CGFloat(dataArray.count) * fixedCellHeight + sectionHeaderHeight + sectionFooterHeight tableViewHeightConstraint.constant = totalHeight // 触发布局更新 view.layoutIfNeeded() tableView.reloadData()
方案2:自定义UITableView实现自动计算高度
如果不想手动维护高度约束,可以自定义UITableView子类,重写固有内容尺寸:
class CustomAutoHeightTableView: UITableView { // 外部传入固定的单个cell高度 var fixedCellHeight: CGFloat = 0 // 有固定header/footer的话也可以定义对应的属性传入 override var intrinsicContentSize: CGSize { var totalHeight: CGFloat = 0 // 多section的话遍历所有section的row数 let totalRowCount = numberOfRows(inSection: 0) totalHeight = CGFloat(totalRowCount) * fixedCellHeight // 加上header/footer高度的逻辑自行补充 return CGSize(width: contentSize.width, height: totalHeight) } override func reloadData() { super.reloadData() // 刷新数据后触发重新计算尺寸 invalidateIntrinsicContentSize() } }
- 使用时将你的UITableView的类改为
CustomAutoHeightTableView,设置好fixedCellHeight,布局时不需要给tableView加高度约束,它会自动根据cell数量调整自身高度。
注意事项
- 不要开启UITableView的预估高度、cell自适应高度相关配置,避免和自定义的高度计算冲突
- 如果存在多个section,计算总row数时需要累加所有section的row数量
内容的提问来源于stack exchange,提问作者c0ded_truth
相关产品推荐
相关产品推荐

