我在 IB 中创建了一个 UIStackView,其分布设置为“Fill Equally”。我希望获取每个子视图的框架,但以下代码始终返回 (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() 的误解。基本上,当主视图的子视图的所有视图都已布局时,就会调用它,但这不包括这些视图的子视图(子视图)。查看讨论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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)