UILabel在UIStackView内部早期中断

时间:2018-05-03 07:58:48

标签: ios autolayout uilabel uistackview

鉴于视图层次结构:

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)
    }
  }

结果: Bug

设置numberOfLines = 1让我想要实现的目标,但标签会失去其多线功能:

Desired behavior

如何强制所需行为而不会失去对多行标签的支持?

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

enter image description here

2 个答案:

答案 0 :(得分:2)

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

将视图分布和对齐方式堆叠到fill

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

答案 1 :(得分:1)

在堆栈视图中,您可以为标签提供约束并切换...

1)给出标签前导,顶部,尾部和底部约束。不要给出宽度约束。在尾随约束中,请使用第二项Switch。

2)给你的开关尾随,顶部,底部和固定宽度。

希望它会起作用。