Currently I have 3 views inside 1 view (which is pinned to leading edge and trailing edge of superview).
The 3 views look like this currently:
However, in some cases, I wish to hide the indigo view, but still keep the last 2 the same widths like so:
How can I achieve this with autolayout? Or how can I achieve this using IBOutlets for constraints?
Stack views let you leverage the power of Auto Layout, creating user interfaces that can dynamically adapt to the device's orientation, screen size, and any changes in the available space. The stack view manages the layout of all the views in its arrangedSubviews property.
Using the object library, drag a Text Field anywhere into your view, then drag a Horizontal Stack View directly below it. Don't worry about size and position: all that matters is that the text field is above the stack view.
If the deployment target is iOS9 or later, it is recommended to use UIStackView
as the enclosing view. Setting isHidden
to true
on any view arranged in the UIStackView
will not only make the view hidden, but also will the stack view re-organize all the non-hidden views to fill up the space that was taken by the hidden views. This behavior could be tuned by adjusting distribution
on UIStackView
.
Tj3n's answer works, but it has a drawback that you have to use magic numbers in your code and set constraint properties both in code and IB.
IMHO, a better solution would be setting up all the constraints in IB with different priorities and activating/deactivating them in code. Try this:
high
.required
, but leave them deactivated in IB. And connect them to IBOutlet
s in code just as connecting views.Note that just with 1 and 2 in place, you can achieve the equal-width view layout. And with 3 and 4, you can collapse/expand any of the views selectively.
Its pretty easy, you can create equal width constraint A for the 3 view, set its priority is 998, then create another single width constraint B1, B2, B3 for them, set priority is 997, if you want to hide any of the 3 view, set B constraint's constant to 0, and up its priority to 999, then call self.view.layoutIfNeeded
, the view will hide and others will scale
The test constraint is the width constraint of the gray view:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With