自定义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
相关产品推荐
相关产品推荐

