如何设置优先级实现类似Twitter作者栏的UIStackView布局?
解决Twitter风格作者栏UIStackView布局问题
核心思路
通过调整每个子视图的内容压缩抵抗优先级(Content Compression Resistance Priority)和内容拥抱优先级(Content Hugging Priority),结合UIStackView的基础配置,实现需求中的布局逻辑。
具体配置步骤
首先完成UIStackView的基础设置:
let stackView = UIStackView() stackView.axis = .horizontal stackView.alignment = .center stackView.spacing = 6 // 根据设计需求调整间距 // 约束StackView宽度到父视图范围 stackView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ stackView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 16), stackView.trailingAnchor.constraint(equalTo: parentView.trailingAnchor, constant: -16), stackView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor) ])
然后逐个配置子视图:
Verified Badge(UIImageView)
- 确保不被压缩,设置水平方向内容压缩抵抗优先级为最高;同时图片无需拉伸,内容拥抱优先级设为最高:
verifiedBadge.setContentCompressionResistancePriority(.required, for: .horizontal) verifiedBadge.setContentHuggingPriority(.required, for: .horizontal)Timestamp(UILabel)
- 禁止被压缩,水平内容压缩抵抗优先级设为最高;需要占据剩余空间,因此水平内容拥抱优先级设为最低:
timestampLabel.setContentCompressionResistancePriority(.required, for: .horizontal) timestampLabel.setContentHuggingPriority(.defaultLow, for: .horizontal) // 可选:设置文字右对齐,符合时间戳的展示习惯 timestampLabel.textAlignment = .rightHandle(UILabel)
- 优先被压缩,设置水平内容压缩抵抗优先级低于Display Name;无需拉伸,内容拥抱优先级设为默认高:
handleLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 749), for: .horizontal) handleLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) // 可选:设置截断模式为中间截断,匹配Twitter风格 handleLabel.lineBreakMode = .byTruncatingMiddleDisplay Name(UILabel)
- 最后被压缩,设置水平内容压缩抵抗优先级高于Handle;无需拉伸,内容拥抱优先级设为默认高:
displayNameLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 750), for: .horizontal) displayNameLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) // 可选:设置截断模式为尾部截断 displayNameLabel.lineBreakMode = .byTruncatingTail
逻辑验证
- 当StackView存在剩余空间时:Timestamp因拥抱优先级最低,会自动拉伸占据剩余宽度,时间戳保持右对齐;
- 当空间不足时:优先压缩Handle(压缩抵抗优先级最低),Handle自动截断;若空间仍不足,再压缩Display Name;Timestamp和Verified Badge始终保持完整,不会被压缩。
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

