UILabel 在 UIStackView 内部提前中断

UILabel breaks early inside 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)
    }
  }

结果:

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

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

当有很多横向 space 时,无论 numberOfLines 属性:

,标签都会正确布局

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

1) 给你的标签 leading, top , trailing 和 bottom 约束。不要给宽度约束。在尾随约束中取第二项 Switch.

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

希望它会起作用。

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

堆栈视图分布和对齐 fill

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

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

UIStackView
--UIStackView
  --UILabel
--UISwitch