通过UIStackView调整视图大小的查找方法(Swift)

9

UIStackView 中的一些视图会根据堆栈进行调整。这些视图被初始化时没有框架,因为它们由堆栈视图重新调整大小。是否有一种方法可以在堆栈视图调整大小后获取视图的大小?


这个问题需要一些细节才能得到更好的答案。1. 当一个视图被堆栈视图重新调整大小时,为什么你需要知道它的大小?2. 你需要在何处知道视图何时被调整大小?换句话说,哪段代码需要处理调整大小?请注意,如果正确使用约束,实际上你很可能不需要在这里做任何事情。 - undefined
4个回答

5

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.
    }
}

2
不幸的是,这并不总是正确的。我遇到过许多情况,在super.layoutSubviews()之后,排列的子视图的几何形状是不正确的。在我的特定情况下,我总是不得不在下一个运行循环中检查它们,这太荒谬了。 - CIFilter

3

是的,在您的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
}

0

我认为获取Stackview子视图框架更好的方法是使用convert

yourStackView.convert(viewInsideStackView.frame to: parentView)

这将返回viewInsideStackViewparentView坐标系中的框架。


尽管通过stackview进行了调整,但这不会获取子视图的框架。 - Ethan Zhao

0
✅ 从UIStackView获取尺寸,对我帮助很大。
let myStack = UIStackView(arrangedSubviews: [myView])
myView.setNeedsLayout()
myView.layoutIfNeeded()
print(myView.frame)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接