Ios 查找由视图调整的视图的大小
调整Ios 查找由视图调整的视图的大小,ios,swift,frame,uistackview,Ios,Swift,Frame,Uistackview,调整UIStackView中的许多视图以适应堆栈。视图初始化时没有框架,因为它们是由堆栈视图调整大小的。是否有一种方法可以在堆栈视图调整视图大小后获得视图的大小 尺寸在UIStackView.layoutSubviews()完成后可用。您可以子类化UIStackView并覆盖layoutsubview: class MyStackView: UIStackView { override func layoutSubviews() { super.layoutSubview
UIStackView
中的许多视图以适应堆栈。视图初始化时没有框架,因为它们是由堆栈视图调整大小的。是否有一种方法可以在堆栈视图调整视图大小后获得视图的大小 尺寸在UIStackView.layoutSubviews()完成后可用。您可以子类化UIStackView
并覆盖layoutsubview
:
class MyStackView: UIStackView {
override func layoutSubviews() {
super.layoutSubviews()
print("arrangedSubviews now have correct frames")
// Post a notification...
// Call a method on an outlet...
// etc.
}
}
我认为获得Stackview子视图框架的更好方法是使用convert
yourStackView.convert(viewInsideStackView.frame to: parentView)
这将在父视图的坐标系内返回视图的框架。是。在视图的布局子视图()
中。
但是,在使用UIStackView的大小之前,需要先使用stack.layoutifneed()
强制它进行布局
例如:
不幸的是,这并不总是正确的。我遇到过许多情况,在super.layoutSubviews()
之后,排列的子视图的几何图形不正确。在我的特殊情况下,我总是要在下一次运行循环中检查它们,这很可笑。但在通过stackview进行调整后,这并没有得到子视图的帧。
public override func layoutSubviews() {
super.layoutSubviews()
// Force the UIStackView to layout, in order to get the updated width.
stack.layoutIfNeeded()
let tabWidth = stack.arrangedSubviews[0].frame.size.width
}