【问题标题】:How to add top level constraints and disable translatesAutoresizingMaskIntoConstraints in Interface Builder .xib file如何在 Interface Builder .xib 文件中添加顶级约束并禁用 translatesAutoresizingMaskIntoConstraints
【发布时间】:2014-11-12 04:25:16
【问题描述】:

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

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

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

如何在从 nib 加载 UIView 而不对其进行子类化时获得此行为?

【问题讨论】:

    标签: uiview interface-builder autolayout xcode6 nib


    【解决方案1】:

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

    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>
    

    更多信息:

    • &lt;UIView: 0x7fec19ccb1b0; frame = (0 0; 320 439); autoresize = W+H; layer = &lt;CALayer: 0x7fec19ccae80&gt;&gt;
    • 翻译AutoresizingMaskIntoConstraints:
    • 无法在 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>
    

    更多信息:

    • &lt;UIView: 0x7f9503eb2ba0; frame = (0 0; 320 439); autoresize = RM+BM; layer = &lt;CALayer: 0x7f9503e9dc80&gt;&gt;
    • 翻译AutoresizingMaskIntoConstraints:
    • 可以在 Interface Builder 中添加顶级约束。

    细微差别:

    • 静态的有一个&lt;autoresizingMask ... 元素。
    • 将 UIView 从 Object Library 拖入空白区域会生成一个静态视图
    • 从对象库中拖入 UIView 作为另一个视图的子视图会生成一个可约束视图(即使您没有定义任何约束)。

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

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

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

    1. 将视图从文档大纲拖到另一个视图中,使其成为子视图(同样,您可能需要为此创建一个临时视图。)
    2. 添加至少一个顶级约束(例如,创建高度约束)。
    3. 将视图拖回空白处。
    4. 在 Simulated Metrics 下的 Attributes Inspector 中将视图的大小改回 Freeform。

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

    1. 将视图从文档大纲拖到另一个视图中,使其成为子视图(同样,您可能需要为此创建一个临时视图。)
    2. 删除其所有顶级约束(例如,删除其宽度/高度约束)。
    3. 将视图拖回空白处。
    4. 在 Simulated Metrics 下的 Attributes Inspector 中将视图的大小改回 Freeform。

    【讨论】:

    • 它非常适合我。但是,在将视图拖回空白处后,似乎无法更改顶级约束的常量(例如宽度)。如果我更改它,则表明宽度约束和“iPhone 纵向屏幕宽度”之间存在冲突。如果我不改变它,它会很好地工作。谢谢!
    • @Hampotato 每当您更改顶级视图的约束时,您都需要更新视图的框架以匹配相同的设置。否则,您的约束将显示为红色并告诉您不匹配。为此,请点击视图,然后选择 Freeform 作为 Simulated Metrics Size(实用程序中的第 4 个选项卡),然后更新框架(实用程序中的第 5 个选项卡)。
    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2014-08-12
    • 2017-02-24
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多