Reputation: 2830
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?
Upvotes: 9
Views: 4033
Reputation: 55
✅ Getting dimensions from UIStackview, helps me a lot.
let myStack = UIStackView(arrangedSubviews: [myView])
myView.setNeedsLayout()
myView.layoutIfNeeded()
print(myView.frame)
Upvotes: 0
Reputation: 1738
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
}
Upvotes: 3
Reputation: 2764
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.
Upvotes: 0
Reputation: 385500
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.
}
}
Upvotes: 5