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



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

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

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

从笔尖加载UIView而不进行子类化时,如何获得这种行为?

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

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>>
  • translates自动调整MaskIntoConstraints:
  • 无法在接口生成器中添加顶级约束

可约束视图

.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>>
  • translates自动调整MaskIntoConstraints:
  • 可以在接口生成器中添加顶级约束

细微差异:

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

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

  1. 将一个UIView拖动到另一个中以创建子视图。(如果你的笔尖里没有任何东西,你需要暂时把一个视图拖到那里,并在这个过程结束时删除它)
  2. 向视图将拥有的视图添加约束(例如创建宽度约束)
  3. 将视图从其超级视图中拖出来,然后将其放在Interface Builder文档的白色部分
  4. 它现在应该没有超级视图,并且您应该能够在视图上创建顶级约束

如何将现有静态视图转换为可约束视图:

  1. 将视图从"文档大纲"拖到另一个视图中,使其成为子视图(同样,您可能需要为此创建一个临时视图)
  2. 至少添加一个顶层约束(例如创建高度约束)
  3. 将视图拖回空白处
  4. 在"模拟度量"下的"属性检查器"中将视图的大小更改回"自由形式"

如何将现有的可约束视图转换回静态视图:

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

最新更新