ChatGPT解决这个技术问题 Extra ChatGPT

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


M
MattyG

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

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

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

https://i.stack.imgur.com/xrcT4.png


@Flink - your edit is wrong. I've reverted my answer back to the original state. Please read it carefully, especially this: "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):"
K
Koen.

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.