Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 307
MattyG Avatar asked May 06 '12 05:05

MattyG


2 Answers

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

enter image description here

like image 198
MattyG Avatar answered Nov 11 '22 07:11

MattyG


UIViewAutoResizingMasks 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.

like image 40
CodaFi Avatar answered Nov 11 '22 07:11

CodaFi