【问题标题】:UIStackView height is not 0 when arranged subviews' heights are all zero当排列的子视图的高度都为零时,UIStackView 高度不为 0
【发布时间】:2018-11-19 08:16:54
【问题描述】:

我想垂直 UIStackView 的高度应该是其排列视图的总高度。但是,当我将所有排列视图的框架高度更改为 0 时,即使调用 view.layoutIfNeeded() 并且所有排列视图都消失了,UIStackView 的框架高度仍然具有非零值。我还尝试将 UIStackView 的 Clip to Bounds 设置为 true,但它仍然不起作用。这是我的代码:

override func viewDidLoad() {
  super.viewDidLoad()
  print("Before --- UIStackView.frame.height: \(stackView.frame.height)")
  print("Before --- firstLabel.frame.height: \(firstLabel.frame.height)")
  print("Before --- secondLabel.frame.height: \(secondLabel.frame.height)")
  print("Before --- thirdLabel.frame.height: \(thirdLabel.frame.height)")
  print("Before --- forthLabel.frame.height: \(forthLabel.frame.height)")
  for view in stackView.arrangedSubviews {
    view.frame = CGRect(x: view.frame.origin.x, y: view.frame.origin.y, width: view.frame.width, height: 0)
  }
  print("===================================")
  print("After --- UIStackView.frame.height: \(stackView.frame.height)")
  print("After --- firstLabel.frame.height: \(firstLabel.frame.height)")
  print("After --- secondLabel.frame.height: \(secondLabel.frame.height)")
  print("After --- thirdLabel.frame.height: \(thirdLabel.frame.height)")
  print("After --- forthLabel.frame.height: \(forthLabel.frame.height)")
  view.layoutIfNeeded()
}

这是日志:

Before --- UIStackView.frame.height: 82.0
Before --- firstLabel.frame.height: 20.5
Before --- secondLabel.frame.height: 20.5
Before --- thirdLabel.frame.height: 20.5
Before --- forthLabel.frame.height: 20.5
 ===================================
After --- UIStackView.frame.height: 82.0
After --- firstLabel.frame.height: 0.0
After --- secondLabel.frame.height: 0.0
After --- thirdLabel.frame.height: 0.0
After --- forthLabel.frame.height: 0.0

【问题讨论】:

    标签: ios iphone swift view


    【解决方案1】:

    使用堆栈视图,您可以简单地隐藏子视图以调整其高度。

    for view in stackView.arrangedSubviews {
        view.isHidden = true
    }
    

    【讨论】:

      【解决方案2】:

      我认为您正在混合使用自动布局和手动设置框架。要查看一切都按预期工作,而不是将标签的框架高度设置为 0,请将其 text 属性设置为空字符串(这会导致高度为 0 的 intrinsicContentSize):

      // Your print statements BEFORE...
      
      for arrangedSubview in stackView.arrangedSubviews {
          if let label = arrangedSubview as? UILabel {
              label.text = ""
          }
      }
      view.layoutIfNeeded()
      
      // Your print statements AFTER...
      

      结果:

      【讨论】:

        【解决方案3】:

        查找总高度并更改视图高度。

        let total = stackView.arrangedSubviews.reduce(0) { result, view in 
        return result + view.frame.height
        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-27
          • 1970-01-01
          • 2019-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多