【问题标题】:UILabel breaks early inside UIStackViewUILabel 在 UIStackView 中提前中断
【发布时间】:2018-10-13 11:00:49
【问题描述】:

给定视图层次结构:

UIStackView
--UILabel
--UISwitch

标签过早中断,即使它可以适合单行。

设置numberOfLines = 1 强制标签正确布局。

如何让 UILabel 只在需要时才执行换行?

代码:

  private lazy var title: UILabel = {
    let v = UILabel()
    v.numberOfLines = 0
    return v
  }()

  private lazy var toggle = UISwitch()
  private lazy var stack = UIStackView(axis: .horizontal,
                                       distribution: .equalSpacing,
                                       alignment: .center,
                                       views: [title,
                                               toggle])
  func setupConstraints() {
    stack.snp.makeConstraints { (make) in
      make.edges.equalTo(contentView.layoutMarginsGuide)
    }
  }

结果:

设置numberOfLines = 1 让我得到了我想要实现的目标,但标签失去了它的多行功能:

如何在不失去对多行标签的支持的情况下强制期望的行为

当水平空间很大时,无论numberOfLines 属性如何,标签都会正确布局:

【问题讨论】:

    标签: ios autolayout uilabel uistackview


    【解决方案1】:

    UISwitch的内容拥抱和抵抗优先级设置为1000。

    堆栈视图分布和对齐到fill

    额外说明 - 如果您希望标签和开关顶部对齐,请将对齐设置为 top

    【讨论】:

    • 拥抱/压缩阻力起到了作用。我选择了filldistributioncenteralignment,多行标签工作正常。正是我想要的,谢谢。
    • 是的,堆栈视图的拥抱和压缩阻力就像一个魅力:)
    【解决方案2】:

    在您的堆栈视图中,您可以对标签和开关施加约束...

    1) 为您的标签提供前导、顶部、尾随和底部约束。不要给宽度约束。在尾随约束中取第二项 Switch。

    2) 提供您的开关尾随、顶部、底部和固定宽度。

    希望它会起作用。

    【讨论】:

    • 那么 StackView 的意义何在?这不就是 StackView 应该提供的行为吗?
    • 如果您不提供自动布局,Stackview 会以相似的宽度划分您的视图。
    • 这不是真的,因为我使用的是equalSpacing 分发版。
    • 我认为您的方法是错误的..您应该了解有关 stackview 的更多信息。 Bcz stackview 间距对于两个子视图相等,那么标签的宽度将是 stackview 的一半。
    • 对不起,我弄错了。在与.equalSpacing 玩了一会儿之后,我发现它的行为与您描述的完全一样。
    【解决方案3】:

    在另一个堆栈视图中添加标签。

    UIStackView
    --UIStackView
      --UILabel
    --UISwitch
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多