【问题标题】:Autoresizing masks programmatically vs Interface Builder / xib / nib以编程方式自动调整掩码与 Interface Builder / xib / nib
【发布时间】:2011-12-06 23:29:08
【问题描述】:

我有一个(可能是错误的)假设,即在 xib 中启用右边距指示器等同于在代码中使用 UIViewAutoresizingFlexibleLeftMargin 等等。

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

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

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

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

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

在 XIB 中?

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

在 XIB 中?

我的 2 个更新的场景是否正确?我现在在我的理解中吗?

【问题讨论】:

  • 你在开玩笑吗?但似乎也有我的困惑所在。所以如果我想拥抱顶部,我会打开底部的自动调整大小。干得好苹果。这是我见过的最愚蠢的设置。
  • 如果你想拥抱顶部,你必须确保你不会在位掩码代码中提及 UIViewAutoresizingFlexibleTopMargin。我之前的假设是错误的,这就是为什么我发布这个问题来清除问题。
  • 你的假设是正确的。你哪里错了?
  • 是的,你引用的两个场景都是正确的。
  • 我为此做了一个简单的工具:erkanyildiz.me/lab/autoresizingmask你可以使用它。

标签: ios cocoa-touch uiview autoresizingmask


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    是的,你引用的东西是正确的。另外,我同意这感觉有点倒退,因此我很欣赏你的帖子。

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

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

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

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

    myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;
    

    而不是

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

    我经常在一行中看到这些边距,就像上面的示例一样。只是很难阅读。

    【讨论】:

    • 每个方向都应该灵活(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)我猜?还是我又糊涂了!
    • FlexibleMargins 将使元素保持居中(不拥抱左、上、右或下边距)。灵活的宽度/高度将使ui元素分别增长/缩小。
    • 现在一切都清楚了吗?另外,当我说我很欣赏你的帖子时,我是认真的。我实际上很喜欢它 b/c 这在过去让我感到困惑。我认为这是一个很棒的问题。
    • 是的,谢谢,现在我明白了,“灵活边距”和“灵活宽度/高度”。这解释了一切,你的“不拥抱左边、上、右边或下边距”是一个很好的解释方式:)
    【解决方案3】:

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

    启用左外线(left strut) 不等同于启用UIViewAutoresizingFlexibleRightMargin。相反,UIViewAutoresizingFlexibleRightMargin = on 如果禁用右支撑,off 如果启用右支撑。

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

    【讨论】:

      【解决方案4】:

      斯威夫特 4 用这个

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

      Objective-C

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

      【讨论】:

      • 您的设置等于 [.flexibleRightMargin, .flexibleBottomMargin] 是什么使框架 x、y、宽度和高度保持不变。 UIKit 中的 X 和 Y 与左上角有关。
      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      相关资源
      最近更新 更多