A number of views in a UIStackView
are adjusted to fit the stack. The views are initialised with no frame because they are resized by the stack view. Is there a way which I can get the size of the views after they have been resized by the stack view?
Finding the size of a view adjusted by a UIStackView swift
Asked Answered
This question needs some details to get better answers. 1. Why do you need to know a view's size when it's been resized by a stack view? 2. Where do you need to know when the view is resized? In other words, what code needs to handle the resize? Note that with the proper use of constraints it's very unlikely that you actually need to do anything here. –
Internode
The sizes are available after UIStackView.layoutSubviews()
finishes. You can subclass UIStackView
and override 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.
}
}
This is not always true, unfortunately. I've encountered many cases where the geometry of the arranged subviews is not correct after
super.layoutSubviews()
. In my specific case, I always had to check them on the very next run loop, which is ridiculous. –
Tupelo Yes. In your View's layoutSubviews()
.
However you need to force the UIStackView to layout first, using stack.layoutIfNeeded()
before using its size.
eg:
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
}
I think the better way to get a Stackview's subview frame is to use convert
.
yourStackView.convert(viewInsideStackView.frame to: parentView)
This will return viewInsideStackView
's frame inside parentView
's coordinate system.
This doesn't get the subview's frame after getting adjusted by the stackview though. –
Tread
✅ Getting dimensions from UIStackview, helps me a lot.
let myStack = UIStackView(arrangedSubviews: [myView])
myView.setNeedsLayout()
myView.layoutIfNeeded()
print(myView.frame)
© 2022 - 2024 — McMap. All rights reserved.