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).
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);