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

时间:2011-10-13 13:28:29

标签: ios cocoa-touch uiview autoresizingmask

我在(可能是假的)假设在xib中启用右边距指示符等同于在代码中使用UIViewAutoresizingFlexibleLeftMargin等等。

所以,我曾经根据这个快照思考: enter image description here

今天晚些时候我不得不进行交叉检查,偶然发现 this thread

还有苹果文档,标题为标题部分 - “使用自动调整规则自动处理布局更改”链接:https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html

所以我现在有了一个新的概念,关于如何以编程方式设置自动调整掩码等同于xib设置:

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

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

在XIB?

场景2 : 在代码中设置(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)等同于:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

在XIB?

我的2个更新方案是否正确?我现在理解了吗?

4 个答案:

答案 0 :(得分:47)

是的,你已正确引用了一些内容。此外,我同意感觉有些倒退,所以我很感谢你的帖子。

在使UIView的边距在各方向都灵活时,您可能会喜欢使用预处理器宏UIViewAutoresizingFlexibleMargins。我把它放在预编译的头文件中,所以它随处可见。

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

使用UIViewAutoresizingFlexibleMargins会使UI元素保持居中,因为它不会拥抱任何一方。要使元素与其父元素一起增长/缩小,请分别设置UIViewAutoresizingFlexibleWidthUIViewAutoresizingFlexibleHeight

我喜欢使用UIViewAutoresizingFlexibleMargins因为我可以稍后引用它:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

而不是

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

我经常看到这些边距在一行上或者像上面的例子一样。只是很难读。

答案 1 :(得分:35)

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

答案 2 :(得分:0)

enter image description here

在框内启用垂直/水平箭头(称为弹簧)将使高度/宽度变得灵活。但启用外线(称为strut)会使该方面不灵活/不灵活。

启用左外侧行(左侧支柱)并不等同于启用UIViewAutoresizingFlexibleRightMargin。相反,UIViewAutoresizingFlexibleRightMargin = on 如果右支撑已禁用,关闭如果启用了右支撑。

一开始很混乱,但如果仔细观察,弹簧和支柱就会有所不同。我不知道Apple为什么会这样做,但对我来说,有些情况下它更容易使用。在代码中使用相反的属性更加令人困惑。

答案 3 :(得分:0)

Swift 4 使用这个

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

<强>目标C

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