Ios 以编程方式自动调整掩码与Interface Builder/xib/nib

Ios 以编程方式自动调整掩码与Interface Builder/xib/nib,ios,cocoa-touch,uiview,autoresizingmask,Ios,Cocoa Touch,Uiview,Autoresizingmask,我的假设(可能是错误的)是,在xib中启用右边距指示器相当于在代码内部使用UIViewAutoResisingFlexibleLeftMargin等等 所以,我曾经根据这张快照思考: 今天晚些时候,我不得不反复核对,偶然发现了 还有苹果的文档,标题为“使用自动调整大小规则自动处理布局更改”的部分,在这个链接中: 因此,我现在有了一个更新的概念,即如何以编程方式设置自动调整大小掩码将等同于xib设置: 场景1: 仅设置(UIViewAutoresizingFlexibleWidth | UIVi

我的假设(可能是错误的)是,在xib中启用右边距指示器相当于在代码内部使用
UIViewAutoResisingFlexibleLeftMargin
等等

所以,我曾经根据这张快照思考:

今天晚些时候,我不得不反复核对,偶然发现了

还有苹果的文档,标题为“使用自动调整大小规则自动处理布局更改”的部分,在这个链接中:

因此,我现在有了一个更新的概念,即如何以编程方式设置自动调整大小掩码将等同于xib设置:

场景1: 仅设置
(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)
相当于:

在锡伯

场景2: 代码中的设置<代码>(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoResizingFlexibleLeLeLeLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoResizingFlexibleToMargin | UIViewAutoResizingLextibleToToMargin)相当于:

在锡伯


我的两个更新方案正确吗?我现在明白了吗?

是的,Interface Builder在某种意义上是“反向的”(或UIView,取决于您如何看待它)。您引用的“场景”是正确的。

是的,您引用的内容是正确的。另外,我也同意这感觉有点倒退,因此我感谢你的帖子

在使UIView的边距在各个方向上都灵活时,您可能希望使用预处理器宏
UIViewAutoResisingFlexibleMargins
。我把它放在预编译的头文件中,这样它就可以包含在任何地方

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin
使用
UIViewAutoresizingFlexibleMargins
将使UI元素保持居中,因为它不会拥抱任何一侧。要使元素与其父元素一起增长/收缩,请分别设置
uiviewsautoresizingflexiblewidth
uiviewsautoresizingflexibleheight

我喜欢使用
UIViewAutoresizingFlexibleMargins
,因为我以后可以像这样引用它:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;
而不是

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
我经常看到这些边距或者像上面的例子一样被放在一行上。只是很难阅读。

启用框内的垂直/水平箭头(称为弹簧)将使高度/宽度灵活。但启用外线(称为支柱)将使该侧不灵活/不灵活

启用左外线(左支柱)并不等同于启用
UIViewAutoResisingFlexiblerRightMargin
。相反,如果右支柱已禁用,则打开查看自动调整尺寸fLexibleRightMargin,如果右支柱已启用,则关闭

一开始很混乱,但是如果你仔细看,弹簧和支柱是不同的。我不知道苹果为什么这么做,但对我来说,在某些情况下,它更容易使用。在代码中使用相反的属性更容易混淆。

Swift 4 用这个

目标-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

我想每个方向都应该灵活(UIViewAutoresizingFlexibleWidth | uiviewAutoresizingflexiblewhight)吧?还是我又糊涂了!FlexibleMargins将使元素保持居中(不紧靠左、上、右或下边缘)。灵活的宽度/高度将使ui元素分别增大/减小。现在一切都清楚了吗?还有,当我说我感谢你的帖子时,我是认真的。实际上我更喜欢b/c,这让我过去很困惑。我认为这是一个很好的问题。是的,谢谢,现在我明白了,“灵活的边距”和“灵活的宽度/高度”。这就解释了一切,你的“不拥抱左、上、右或下边距”是一个很好的解释:)你在开玩笑吗?但我的困惑似乎也存在。因此,如果我想拥抱顶部,我会打开底部自动调整大小。干得好,苹果。这是我见过的最愚蠢的设置。如果你想拥抱top,你必须确保在位掩码代码中不会提到UIViewAutoresizingFlexibleTopMargin。我之前的假设是错误的,这就是为什么我发布这个问题来澄清问题的原因。你的假设是正确的。你哪里错了?是的,你引用的两个场景是正确的。我为此制作了一个简单的工具:你可以使用它。你的设置等于[.flexibleRightMargin,.flexibleBottomMargin],这使得帧x,y,宽度和高度恒定。UIKit中的X和Y与左上角相关。
myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;