如何获取UITableView中所有不同高度单元格的高度?已掌握可见单元格获取法
获取UITableView所有单元格的总高度(单元格高度不一致时)
嘿,我来帮你搞定这个问题!你现在能拿到可见单元格的高度,但那些还没滚到视野里的单元格因为还没被实例化,直接取cell的frame肯定行不通对吧?下面给你两个靠谱的方案:
方案一:利用UITableView的heightForRow(at:)方法遍历计算
如果你的表格已经实现了动态高度的逻辑(不管是手动在heightForRowAt里计算,还是用自动布局自动计算),直接遍历所有section和row,调用这个方法获取每个单元格的高度再累加就好:
var totalHeight: CGFloat = 0.0 let sectionCount = tableView.numberOfSections for section in 0..<sectionCount { let rowCount = tableView.numberOfRows(inSection: section) for row in 0..<rowCount { let indexPath = IndexPath(row: row, section: section) // 调用系统方法获取对应行的高度,为空的话默认加0 totalHeight += tableView.heightForRow(at: indexPath) ?? 0.0 } } // 最终totalHeight就是所有单元格的总高度
这个方法的好处是不需要创建实际的单元格实例,效率很高,哪怕数据源很大也不用担心性能问题。如果是用自动布局自动计算高度(设置了estimatedRowHeight和rowHeight = UITableView.automaticDimension),只要你的单元格约束是完整的,heightForRow(at:)也能正确返回系统计算好的高度。
方案二:提前在数据源模型中存储计算好的高度
如果你的单元格高度计算逻辑比较复杂(比如需要富文本计算、加载图片高度等),可以提前把每个单元格的高度计算好,存在对应的数据源模型里,之后直接遍历模型数组累加就行:
// 假设你的数据源是yourDataSourceArray,每个元素是YourModel,包含预计算好的cellHeight属性 var totalHeight: CGFloat = 0.0 for model in yourDataSourceArray { totalHeight += model.cellHeight }
这个方法是效率最高的,因为高度只需要计算一次,避免了重复计算的开销,适合高度计算耗时的场景。
避坑提醒
千万不要尝试手动创建所有单元格来获取高度!这样不仅会浪费大量内存,还会拖慢性能,完全没必要——上面两个方案已经能完美解决问题啦。
内容的提问来源于stack exchange,提问作者siva kumar
相关产品推荐
相关产品推荐

