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

Sen*_*ful 4 interface-builder uiview nib autolayout xcode6

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

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

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

如何从笔尖加载UIView而不进行子类化时,我怎么能得到这种行为?

Sen*_*ful 9

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

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

如果视图需要内部内容大小,可以覆盖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>
Run Code Online (Sandbox Code Playgroud)

更多信息:

  • <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>
Run Code Online (Sandbox Code Playgroud)

更多信息:

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

细微差别:

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

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

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

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

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

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

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