我在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)
}
}
我认为设置为平均填充的堆栈视图会自动设置计算它。
任何帮助都将不胜感激。
答案 0 :(得分:17)
在阅读完代码后,我认为这只是对viewDidLayoutSubviews()的误解。基本上,当所有作为主视图后代的视图已经布局但是这不包括这些视图的子视图(后代)时,它会被调用。请参阅Apple的讨论notes。
"当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统会调用此方法。但是,调用此方法并不表示已调整视图子视图的各个布局。每个子视图负责调整自己的布局。"
现在有很多方法可以获得子视图的框架。
首先,您可以在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)
}