如何在Interface Builder .xib文件中添加顶级约束并禁用translatesAutoresizingMaskIntoConstraints

时间:2014-09-18 00:19:34

标签: uiview interface-builder autolayout xcode6 nib

从nib文件加载UIView时,视图通常将translatesAutoresizingMastIntoConstraints设置为YES。

因此,您无法向视图添加顶级约束(例如宽度和高度)。

过去我能够生成一个顶级视图,它允许我创建顶级约束,并将translatesAutoresizingMastIntoConstraints设置为NO。

如何在没有子类化的情况下从笔尖加载UIView时会出现这种行为吗?

1 个答案:

答案 0 :(得分:9)

更新虽然您可以创建可约束的视图,但我不推荐它,因为它很难区分两者之间的区别。如果您需要修改或重新创建视图,您可能会忘记它是一个可约束的视图并意外地重新创建静态视图。因此,我建议您将顶级视图保留为静态视图,并在从笔尖创建它们后手动更新它们:

let view = UINib(nibName: "ABCView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
view.translatesAutoresizingMaskIntoConstraints = false

如果视图需要内在内容大小,请覆盖intrinsicContentSize,或通过nib文件定义其宽度和/或高度,只需添加"大小调整"子视图固定在顶级视图(即静态视图的顶部,底部,尾部和前导约束)上,并具有宽度和/或高度约束。


这似乎是一个未记录的Xcode功能(在Xcode 6和Xcode 7.1上测试过)。

我将使用以下术语:

  • 静态视图:不允许顶级约束的默认视图,并且translatesAutoresizingMaskIntoConstraints设置为YES。
  • 可约束视图:允许您创建顶级约束的视图,并且translatesAutoresizingMaskIntoConstraints设置为NO。

首先让我们来看看他们的一些差异......

静态视图

.xib内容:

<view contentMode="scaleToFill" id="bU6-qJ-x7d" userLabel="STATIC">
    <rect key="frame" x="0.0" y="0.0" width="320" height="439"/>
    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
    <nil key="simulatedStatusBarMetrics"/>
    <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
    <point key="canvasLocation" x="687" y="37.5"/>
</view>

更多信息:

  • <UIView: 0x7fec19ccb1b0; frame = (0 0; 320 439); autoresize = W+H; layer = <CALayer: 0x7fec19ccae80>>
  • translatesAutoresizingMaskIntoConstraints:
  • 无法在Interface Builder中添加顶级约束。

可限制视图

.xib内容:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0G6-nE-8IZ" userLabel="CONSTRAINABLE">
    <rect key="frame" x="0.0" y="0.0" width="320" height="439"/>
    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
    <nil key="simulatedStatusBarMetrics"/>
    <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
    <point key="canvasLocation" x="687" y="-455.5"/>
</view>

更多信息:

  • <UIView: 0x7f9503eb2ba0; frame = (0 0; 320 439); autoresize = RM+BM; layer = <CALayer: 0x7f9503e9dc80>>
  • translatesAutoresizingMaskIntoConstraints:
  • 可以在Interface Builder中添加顶级约束。

细微差别:

  • 静态元素具有<autoresizingMask ...元素。
  • 将UIView从对象库拖动到空白区域会产生静态视图
  • 从对象库中拖动UIView作为另一个视图的子视图会产生可约束视图(即使您没有定义任何约束)。

如何创建新的可约束视图:

  1. 将UIView拖到另一个中以创建子视图。 (如果您在笔尖中没有任何内容,则需要暂时​​拖动视图,并在此过程结束时将其删除。)
  2. 向视图将拥有的视图添加约束(例如,创建宽度约束)。
  3. 将视图拖出其超视图并将其放在Interface Builder文档的白色部分。
  4. 它现在应该没有superview,你应该能够在视图上创建顶级约束。
  5. 如何将现有静态视图转换为可约束视图:

    1. 将视图从文档大纲拖到另一个视图中,使其成为子视图(同样,您可能需要为此创建临时视图。)
    2. 添加至少一个顶级约束(例如,创建高度约束)。
    3. 将视图拖回空白区域。
    4. 在模拟指标下的属性检查器中将视图的大小更改回自由形式。
    5. 如何将现有的可约束视图转换回静态视图:

      1. 将视图从文档大纲拖到另一个视图中,使其成为子视图(同样,您可能需要为此创建临时视图。)
      2. 删除所有顶级约束(例如,删除其宽度/高度限制)。
      3. 将视图拖回空白区域。
      4. 在模拟指标下的属性检查器中将视图的大小更改回自由形式。