如何实现UITableView自定义UITableViewCell动态高度及整体高度自适应
修复方案
1. 单元格自适应高度异常修复
你使用UITableView.automaticDimension返回高度固定为44的核心原因是自定义Cell内部约束不完整,按以下步骤修复:
- 自定义Cell内部必须完成完整的上下约束链:Cell的
contentView内所有子控件的顶部、底部约束必须和contentView的上下边缘绑定,不能缺失垂直方向约束。如果包含多行文本的UILabel,必须设置numberOfLines = 0,允许文本换行撑开控件高度。 - 在
viewDidLoad中添加TableView自动高度全局配置:
tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 200 // 填入预估的单元格平均高度即可,无需精准
- 删除冗余逻辑:删除
cellForRowAt中存储self.cellHeight的代码,以及heightForRowAt代理方法中返回self.cellHeight的逻辑。如果需要保留heightForRowAt方法,直接返回UITableView.automaticDimension即可。
2. UITableView整体高度计算错误修复
你在reloadData后立即读取contentSize高度错误,是因为reloadData是异步操作,调用完成后TableView布局尚未完成,contentSize还未更新为最新值,按以下方式修复:
self.tableView.reloadData() // 强制触发TableView布局,等待布局完成 self.tableView.layoutIfNeeded() self.tableView.snp.remakeConstraints { (make) -> Void in make.left.right.leading.trailing.top.equalToSuperview() if(self.hasLoader == true) { make.bottom.equalTo(self.loadMoreButton.snp.top) } make.height.equalTo(self.tableView.contentSize.height) }
额外注意点
- 如果自定义Cell内包含异步加载的图片,图片加载完成后需要主动调用
tableView.reloadRows(at: [indexPath], with: .none)触发单元格高度重算,避免图片加载完成后单元格高度不会自动更新。 - 你当前设置
tableView.isScrollEnabled = false的配置符合非滚动列表、高度跟随内容自适应的场景,无需修改。
内容的提问来源于stack exchange,提问作者Mathieu Rios
相关产品推荐
相关产品推荐

