我在IB中创建了一个UIStackView,它的分布设置为均匀填充。我希望获得每个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)
}
}我认为设置为填充相等的堆栈视图会自动设置calculate it。
任何帮助都将不胜感激。
发布于 2017-03-20 07:32:47
仔细阅读您的代码后,我认为这只是对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)
}https://stackoverflow.com/questions/42890174
复制相似问题