UIStackView
中的一些视图会根据堆栈进行调整。这些视图被初始化时没有框架,因为它们由堆栈视图重新调整大小。是否有一种方法可以在堆栈视图调整大小后获取视图的大小?
UIStackView
中的一些视图会根据堆栈进行调整。这些视图被初始化时没有框架,因为它们由堆栈视图重新调整大小。是否有一种方法可以在堆栈视图调整大小后获取视图的大小?
在UIStackView.layoutSubviews()
完成后,可用的尺寸将会被更新。你可以通过子类化 UIStackView
并重写 layoutSubviews
方法来实现:
class MyStackView: UIStackView {
override func layoutSubviews() {
super.layoutSubviews()
print("arrangedSubviews now have correct frames")
// Post a notification...
// Call a method on an outlet...
// etc.
}
}
super.layoutSubviews()
之后,排列的子视图的几何形状是不正确的。在我的特定情况下,我总是不得不在下一个运行循环中检查它们,这太荒谬了。 - CIFilter是的,在您的View的layoutSubviews()
方法中。
但是,您需要先强制UIStackView进行布局,使用stack.layoutIfNeeded()
,然后再使用其大小。
例如:
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
}
我认为获取Stackview子视图框架更好的方法是使用convert
。
yourStackView.convert(viewInsideStackView.frame to: parentView)
这将返回viewInsideStackView
在parentView
坐标系中的框架。
let myStack = UIStackView(arrangedSubviews: [myView])
myView.setNeedsLayout()
myView.layoutIfNeeded()
print(myView.frame)