获取UIStackView子视图的框架

我在IB中创建了一个UIStackView,其分布设置为Fill Equally。 我希望得到每个subView的帧,但以下代码总是返回(0,0,0,0)。

class ViewController: UIViewController { @IBOutlet weak var stackView: UIStackView! override func viewDidLoad() { super.viewDidLoad() let pView = UIView() let sView = UIView() pView.backgroundColor = UIColor.red sView.backgroundColor = UIColor.orange stackView.addArrangedSubview(pView) stackView.addArrangedSubview(sView) } override func viewDidLayoutSubviews() { print(stackView.arrangedSubviews[0].frame) print(stackView.arrangedSubviews[1].frame) } } 

我认为堆栈视图设置为同等填充将自动设置计算它。

任何帮助,将不胜感激。

阅读完代码之后,我认为这只是对viewDidLayoutSubviews()的一种误解。 基本上,当所有作为主视图后代的视图已经布局但是这不包括这些视图的子视图(后代)时,它会被调用。 请参阅Apple的讨论说明 。

“当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统会调用此方法。但是,调用此方法并不表示视图的子视图的各个布局已经过调整。每个子视图负责调整自己的布局。“

现在有很多方法可以获得子视图的框架。

首先,您可以在viewdidload中添加一行代码并将其获取。

  override func viewDidLoad() { super.viewDidLoad() let pView = UIView() let sView = UIView() pView.backgroundColor = UIColor.red sView.backgroundColor = UIColor.orange stackView.addArrangedSubview(pView) stackView.addArrangedSubview(sView) stackView.layoutIfNeeded() print(stackView.arrangedSubviews[0].frame) print(stackView.arrangedSubviews[1].frame) } 

或者你可以等到viewDidAppear并检查那里。

  override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print(stackView.arrangedSubviews[0].frame) print(stackView.arrangedSubviews[1].frame) }