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

自定义UITableViewCell多文本布局适配:三文本框完整显示需求

解决自定义UITableViewCell的多行文本布局问题

嘿,我来帮你搞定这个布局难题!你遇到的Descrizione文本过长导致显示不全、Prezzo偏移的问题,核心是没给三个Label设置合理的自动布局约束,加上没开启tableView的自动行高计算。下面给你两种靠谱的解决方案:

方案一:纯Auto Layout手动约束(精准控制)

这个方案能让你完全掌控每个Label的位置,避免偏移:

步骤1:配置三个Label的基础属性

首先在你的CustomTableViewCellArticolo里,给三个Label设置好换行和自适应的属性:

import UIKit

class CustomTableViewCellArticolo: UITableViewCell {
    // 三个文本字段
    let labCodArt = UILabel()
    let labDescrizione = UILabel()
    let labPrezzo = UILabel()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupCell()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupCell()
    }
    
    private func setupCell() {
        // 先把三个Label添加到contentView
        [labCodArt, labDescrizione, labPrezzo].forEach {
            $0.translatesAutoresizingMaskIntoConstraints = false
            contentView.addSubview($0)
        }
        
        // 配置CodArt:单行显示
        labCodArt.font = UIFont.systemFont(ofSize: 14, weight: .semibold)
        labCodArt.numberOfLines = 1
        
        // 配置Descrizione:多行自动换行
        labDescrizione.font = UIFont.systemFont(ofSize: 13)
        labDescrizione.numberOfLines = 0 // 0表示自动换行,显示所有内容
        labDescrizione.lineBreakMode = .byWordWrapping // 按单词换行,避免截断单词
        
        // 配置Prezzo:单行显示,固定位置不偏移
        labPrezzo.font = UIFont.systemFont(ofSize: 14, weight: .bold)
        labPrezzo.numberOfLines = 1
        labPrezzo.textAlignment = .right
        
        // 添加Auto Layout约束
        NSLayoutConstraint.activate([
            // CodArt:顶部、左、右(和Prezzo留间距)固定
            labCodArt.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
            labCodArt.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12),
            labCodArt.trailingAnchor.constraint(equalTo: labPrezzo.leadingAnchor, constant: -8),
            
            // Prezzo:顶部、右固定,宽度自适应内容(不被压缩)
            labPrezzo.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
            labPrezzo.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -12),
            labPrezzo.setContentCompressionResistancePriority(.required, for: .horizontal),
            
            // Descrizione:在CodArt下方,左、右和contentView对齐,底部留间距
            labDescrizione.topAnchor.constraint(equalTo: labCodArt.bottomAnchor, constant: 8),
            labDescrizione.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12),
            labDescrizione.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -12),
            labDescrizione.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -12)
        ])
    }
}

步骤2:开启TableView的自动行高

在你的ViewController里,设置tableView的行高为自动计算:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 100 // 给一个估计值,让tableView更快计算
}

方案二:用UIStackView简化布局(更高效)

如果你不想写一堆约束,用StackView能快速实现自适应布局:

private func setupCell() {
    [labCodArt, labDescrizione, labPrezzo].forEach {
        $0.translatesAutoresizingMaskIntoConstraints = false
        // 同样设置三个Label的字体、行数属性(和方案一一致)
        labCodArt.font = UIFont.systemFont(ofSize: 14, weight: .semibold)
        labCodArt.numberOfLines = 1
        
        labDescrizione.font = UIFont.systemFont(ofSize: 13)
        labDescrizione.numberOfLines = 0
        labDescrizione.lineBreakMode = .byWordWrapping
        
        labPrezzo.font = UIFont.systemFont(ofSize: 14, weight: .bold)
        labPrezzo.numberOfLines = 1
        labPrezzo.textAlignment = .right
    }
    
    // 垂直栈:放CodArt和Descrizione
    let verticalStack = UIStackView(arrangedSubviews: [labCodArt, labDescrizione])
    verticalStack.translatesAutoresizingMaskIntoConstraints = false
    verticalStack.axis = .vertical
    verticalStack.spacing = 8
    verticalStack.alignment = .leading
    
    // 水平栈:放垂直栈和Prezzo
    let horizontalStack = UIStackView(arrangedSubviews: [verticalStack, labPrezzo])
    horizontalStack.translatesAutoresizingMaskIntoConstraints = false
    horizontalStack.axis = .horizontal
    horizontalStack.spacing = 8
    horizontalStack.alignment = .top
    horizontalStack.distribution = .fill
    
    contentView.addSubview(horizontalStack)
    
    // 给水平栈加约束,固定在contentView内
    NSLayoutConstraint.activate([
        horizontalStack.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
        horizontalStack.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12),
        horizontalStack.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -12),
        horizontalStack.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -12)
    ])
    
    // 让Prezzo保持宽度,不被压缩
    labPrezzo.setContentCompressionResistancePriority(.required, for: .horizontal)
}

关键注意点

  • 一定要把labDescrizione的numberOfLines设为0,否则文本会被截断成一行
  • Prezzo的约束要固定在右侧,并且设置contentCompressionResistancePriority为required,这样不管Descrizione多长,Prezzo都不会被挤走或者偏移
  • 必须开启tableView的automaticDimension,否则cell不会自动调整高度来显示所有文本

内容的提问来源于stack exchange,提问作者riki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:17:19