Matt Spoon
Matt Spoon

Reputation: 2830

Finding the size of a view adjusted by a UIStackView swift

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

Answers (4)

zef_s
zef_s

Reputation: 55

✅ Getting dimensions from UIStackview, helps me a lot.

let myStack = UIStackView(arrangedSubviews: [myView])
myView.setNeedsLayout()
myView.layoutIfNeeded()
print(myView.frame)

Upvotes: 0

MihaiL
MihaiL

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

David T
David T

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

rob mayoff
rob mayoff

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

Related Questions