为啥 UIStackView 调整排列的子视图的大小?

Posted

技术标签:

【中文标题】为啥 UIStackView 调整排列的子视图的大小?【英文标题】:Why UIStackView resize arranged subviews?为什么 UIStackView 调整排列的子视图的大小? 【发布时间】:2018-11-29 06:06:07 【问题描述】:

为什么UIStackView 调整子视图的大小?我认为当我将distribution 设置为.fill 时它会起作用。但.equalSpacing 并不暗示这种行为。我是对的?

let stackView = UIStackView()
    stackView.alignment = .firstBaseline
    stackView.axis = .vertical
    stackView.distribution = .equalSpacing
    stackView.spacing = 0.0
    stackView.translatesAutoresizingMaskIntoConstraints = true
    self.view.addSubview(stackView)

    stackView.snp.makeConstraints  (make) -> Void in
      make.top.equalTo(button.snp.bottom)
      make.left.equalTo(view).offset(16.0)
      make.bottom.equalTo(view)
      make.right.equalTo(view).offset(-16.0)
    

    let exampleView = UIView(frame: .zero)
    stackView.addArrangedSubview(exampleView)
    exampleView.backgroundColor = .yellow

    exampleView.snp.makeConstraints  (make) in
      make.width.equalToSuperview()
      make.height.equalTo(60.0)
    

【问题讨论】:

您不应该在exampleView 上设置widthheight 约束。让stackview 处理它的孩子。 @Kamran 但我想要子视图的固定高度 设置为stackView @AleksandrMaybach - 您希望您的子视图具有特定的高度吗?好的,但是您是否希望它们以更大的间距“展开”以填充视图的高度?例如3 个子视图,每个 60 磅的高度,它们之间可能有 100 磅的垂直间距?或者,您是否想要特定间距,但不填充视图的高度?例如3 个子视图,每个 60 分,垂直间距为 10 分,所以它们总共只能达到 200 分? 没有“展开”。不填,不是什么。只需固定到顶部。 【参考方案1】:

UIStackView排列其子视图。

这意味着:

如果您限制其高度(高度限制或顶部和底部限制),它将调整子视图的大小/布局以适合其高度。 如果您限制其高度,它将使用其子视图高度进行布局。

【讨论】:

【参考方案2】:

请查看关于UIStackViewDistributionEqualSpacing

的苹果文档

堆栈视图定位其排列视图的布局,以便它们沿堆栈视图的轴填充可用空间。当排列的视图没有填满堆栈视图时,它会均匀地填充视图之间的间距。如果排列的视图不适合堆栈视图,它会根据其抗压优先级缩小视图。如果有任何歧义,堆栈视图会根据它们在排列子视图数组中的索引来缩小视图。

https://developer.apple.com/documentation/uikit/uistackviewdistribution/uistackviewdistributionequalspacing?language=objc

【讨论】:

以上是关于为啥 UIStackView 调整排列的子视图的大小?的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 图层属性

为啥 UIStackView 不堆叠 UILabel 安排的子视图?

如何在 UIStackView 内排列的子视图上设置自定义高度?

UIStackView 隐藏/取消隐藏排列的子视图问题

如何在 Xcode 中调整 UIStackView 的子视图大小?

即使隐藏了排列的子视图,UIStackView 似乎也会堆叠间距