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

如何根据UILabel文本动态设置UITableViewCell的高度?

搞定UITableViewCell动态高度的两种方法

嘿,我来帮你搞定这个根据文本内容计算cell高度的问题!下面给你两种方案,一种是苹果官方推荐的省心方案,另一种是手动计算的方法,你可以根据自己的需求选。

方案一:自动布局+系统自动计算高度(推荐)

这是现在最简洁不容易出错的方式,不用自己写复杂的高度计算逻辑,步骤如下:

  • 给cell里的两个UILabel设置完整的自动布局约束:
    • 标题Label:顶部、左、右和cell的contentView对齐(比如各留16pt内边距),设置numberOfLines = 0允许换行
    • 描述Label:顶部和标题Label的底部留8pt间距,左、右和contentView对齐,底部和contentView对齐(留16pt内边距),同样设置numberOfLines = 0
  • 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:35:58