如何根据文本长度设置Layout Anchors,实现UITableViewCell内两个UILabel同行排布
实现方案
你当前的代码给firstNameLabel设置了固定100pt的宽度约束,这是无法自适应文本长度的核心原因,只需要调整约束逻辑、配合内容优先级设置即可实现需求。
具体修改步骤
- 第一步:删除
firstNameLabel的固定宽度约束,直接移除以下代码:firstNameLabel.widthAnchor.constraint(equalToConstant: 100).isActive = true - 第二步:设置两个Label的抗压缩与内容拥抱优先级,避免文本过长时布局冲突:
我们需要保证姓氏Label优先完整展示,名字Label长度不足时不会被无故拉伸、长度过长时优先被截断,因此优先级设置规则如下:- 姓氏Label的抗压缩优先级高于名字Label,避免姓氏内容被压缩
- 名字Label的内容拥抱优先级高于姓氏Label,避免名字区域出现多余空白
- 第三步:可选配置截断规则,可根据需求给名字Label设置尾部截断,优化长文本展示效果:
firstNameLabel.lineBreakMode = .byTruncatingTail
修改后的完整代码
func setFirstnameLabel() { firstNameLabel.translatesAutoresizingMaskIntoConstraints = false // 内容拥抱优先级设为更高,避免被拉伸出现多余空白 firstNameLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) // 抗压缩优先级设为更低,文本过长时优先被截断 firstNameLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) firstNameLabel.lineBreakMode = .byTruncatingTail firstNameLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true firstNameLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12).isActive = true firstNameLabel.heightAnchor.constraint(equalToConstant: 30).isActive = true } func setLastNameLabel() { lastNameLabel.translatesAutoresizingMaskIntoConstraints = false // 抗压缩优先级设为更高,优先展示完整姓氏内容 lastNameLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) lastNameLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true lastNameLabel.leadingAnchor.constraint(equalTo: firstNameLabel.trailingAnchor, constant: 20).isActive = true lastNameLabel.heightAnchor.constraint(equalToConstant: 30).isActive = true lastNameLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -12).isActive = true }
效果说明
修改后两个Label会自动根据文本内容调整布局:
- 名字较短时,名字Label宽度自动贴合文本,姓氏Label紧跟在名字右侧20pt的位置
- 名字过长时,名字Label会自动截断尾部内容,保证姓氏Label完整展示在右侧,不会超出cell边界
内容的提问来源于stack exchange,提问作者beginner992
相关产品推荐
相关产品推荐

