【发布时间】:2015-11-06 03:01:20
【问题描述】:
调整UIStackView 中的多个视图以适应堆栈。视图初始化时没有框架,因为它们由堆栈视图调整大小。有没有一种方法可以在堆栈视图调整视图大小后获取视图的大小?
【问题讨论】:
标签: ios swift frame uistackview
调整UIStackView 中的多个视图以适应堆栈。视图初始化时没有框架,因为它们由堆栈视图调整大小。有没有一种方法可以在堆栈视图调整视图大小后获取视图的大小?
【问题讨论】:
标签: ios swift frame 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() 之后排列的子视图的几何形状不正确。在我的具体情况下,我总是不得不在下一个运行循环中检查它们,这很荒谬。
是的。在您的视图中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 坐标系内的框架。
【讨论】: