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

如何设置优先级实现类似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)
])

然后逐个配置子视图:

  1. Verified Badge(UIImageView)

    • 确保不被压缩,设置水平方向内容压缩抵抗优先级为最高;同时图片无需拉伸,内容拥抱优先级设为最高:
    verifiedBadge.setContentCompressionResistancePriority(.required, for: .horizontal)
    verifiedBadge.setContentHuggingPriority(.required, for: .horizontal)
    
  2. Timestamp(UILabel)

    • 禁止被压缩,水平内容压缩抵抗优先级设为最高;需要占据剩余空间,因此水平内容拥抱优先级设为最低:
    timestampLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
    timestampLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
    // 可选:设置文字右对齐,符合时间戳的展示习惯
    timestampLabel.textAlignment = .right
    
  3. Handle(UILabel)

    • 优先被压缩,设置水平内容压缩抵抗优先级低于Display Name;无需拉伸,内容拥抱优先级设为默认高:
    handleLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 749), for: .horizontal)
    handleLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
    // 可选:设置截断模式为中间截断,匹配Twitter风格
    handleLabel.lineBreakMode = .byTruncatingMiddle
    
  4. Display 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:30:57