如何根据UILabel文本动态设置UITableViewCell的高度?
搞定UITableViewCell动态高度的两种方法
嘿,我来帮你搞定这个根据文本内容计算cell高度的问题!下面给你两种方案,一种是苹果官方推荐的省心方案,另一种是手动计算的方法,你可以根据自己的需求选。
方案一:自动布局+系统自动计算高度(推荐)
这是现在最简洁不容易出错的方式,不用自己写复杂的高度计算逻辑,步骤如下:
- 给cell里的两个UILabel设置完整的自动布局约束:
- 标题Label:顶部、左、右和cell的contentView对齐(比如各留16pt内边距),设置
numberOfLines = 0允许换行 - 描述Label:顶部和标题Label的底部留8pt间距,左、右和contentView对齐,底部和contentView对齐(留16pt内边距),同样设置
numberOfLines = 0
- 标题Label:顶部、左、右和cell的contentView对齐(比如各留16pt内边距),设置
- 在ViewController的
viewDidLoad里添加两行代码:
override func viewDidLoad() { super.viewDidLoad() // 开启自动计算cell高度 tableView.rowHeight = UITableView.automaticDimension // 设置一个预估高度,帮助tableView优化滚动性能,数值可以根据你的cell大致高度填 tableView.estimatedRowHeight = 80 }
这样就完全不用实现heightForRowAt方法了,系统会根据你的自动布局约束和文本内容自动算出准确的cell高度,后续修改字体、内边距也不用改高度计算代码,超省心!
方案二:手动计算高度(如果你一定要自己实现heightForRowAt)
如果因为某些原因必须手动计算,那要确保计算逻辑和cell里的实际布局、字体完全匹配,代码示例如下:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { // 先拿到当前行的数据 let item = yourDataSourceArray[indexPath.row] let titleText = item.title ?? "" let descText = item.description ?? "" // 计算Label的可用宽度:tableView宽度减去cell左右内边距(假设你给contentView左右各留了16pt) let availableLabelWidth = tableView.bounds.width - 32 // 16*2 // 计算标题Label的高度 let titleFont = UIFont.systemFont(ofSize: 16, weight: .semibold) // 和cell里标题Label的字体一致 let titleRect = titleText.boundingRect( with: CGSize(width: availableLabelWidth, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: titleFont], context: nil ) let titleHeight = titleRect.height // 计算描述Label的高度 let descFont = UIFont.systemFont(ofSize: 14) // 和cell里描述Label的字体一致 let descRect = descText.boundingRect( with: CGSize(width: availableLabelWidth, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: descFont], context: nil ) let descHeight = descRect.height // 加上所有间距和内边距:cell上下内边距(比如各12pt)+ 标题和描述之间的间距(比如8pt) let totalHeight = 12 + titleHeight + 8 + descHeight + 12 // 用ceil取整,避免出现小数高度导致的模糊问题 return ceil(totalHeight) }
手动计算的注意事项:
- 必须确保cell里的UILabel设置了
numberOfLines = 0,否则文本不会换行,计算出的高度会是单行高度 - 计算时用的字体、内边距、间距必须和cell里实际的布局完全一致,否则会出现高度不匹配的情况
- 如果后续修改了cell的布局或字体,一定要同步更新这里的计算逻辑,不然会出问题
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

