How to use UIView autoresizingMask property programmatically?
I've laid out some subviews with Interface Builder, but I'd like to do it in code instead.
I've read the UIView docs about setting the view.autoresizingMask
property. I'm looking for a logical explanation of how to translate the struts and springs by using the various masks offered (e.g., UIViewAutoresizingFlexibleLeftMargin
, etc).
Solution 1:
When setting the autoresizing mask for a view, use a bitwise inclusive OR (|
) (Objective-C), or an array (Swift 2, 3, 4) to specify springs and struts.
-
Springs are represented by specifying a mask (Objective-C or Swift, respectively):
vertical spring:
UIViewAutoresizingFlexibleHeight
or.flexibleHeight
horizontal spring:
UIViewAutoresizingFlexibleWidth
or.flexibleWidth
-
Struts are represented by the lack of one of the four 'flexible margin' masks (i.e. if a strut does not exist, the mask for that margin is specified):
UIViewAutoresizingFlexibleLeftMargin
or.flexibleLeftMargin
UIViewAutoresizingFlexibleRightMargin
or.flexibleRightMargin
UIViewAutoresizingFlexibleTopMargin
or.flexibleTopMargin
UIViewAutoresizingFlexibleBottomMargin
or.flexibleBottomMargin
For example, a view with a horizontal spring and top and bottom struts would have the width, and left and right margins specified as flexible:
Swift 3 and 4
mySubview.autoresizingMask = [.flexibleWidth, .flexibleLeftMargin, .flexibleRightMargin]
Swift 2
mySubview.autoresizingMask = [.FlexibleWidth, .FlexibleLeftMargin, .FlexibleRightMargin]
Swift 1.2
mySubview.autoresizingMask = .FlexibleWidth | .FlexibleLeftMargin | .FlexibleRightMargin
Objective-C
mySubview.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin);
Solution 2:
UIViewAutoResizingMask
s are what we refer to as 'struts' and 'springs'. Consider this: you have a large square with a small square inside. In order for that square to stay perfectly centered, you must set a fixed width from each inside edge of the large square, so as to constrain it. These are struts.
Springs, on the other hand, work more like a UIView
does during rotation. Let's say our view must stay on the bottom of the screen, aligned in the center (Much like a UIToolbar
). We want to keep it's Top spring flexible so that when the view rotates from 460 px to 320 px, it keeps it's same position relative to the screen's now changed dimensions. Highlighting one of those springs in IB is equal to setting the appropriate UIViewAutoResizingMask
and highlighting the top spring specifically is akin to calling myView.autoResizingMask = UIViewAutoresizingFlexibleTopMargin
.
Values may be used in tandem by enclosing them in a pair of parenthesis and using an or operator like myView.autoResizingMask = (UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin)
The masks are reporting numbers to you because they are a typdef of an NSUInteger
and those are the flags that apple has assigned them. Cmd+click on one to see its method definition.