在界面构建器中使用约束

Posted

技术标签:

【中文标题】在界面构建器中使用约束【英文标题】:Working with constraints in interface builder 【发布时间】:2012-10-22 13:44:20 【问题描述】:

所以,我无法理解界面生成器中的约束。

我自己无法添加它们 - 界面生成器似乎认为它最了解。

我也无法将它们带走(我可以转换为“用户”约束,然后删除,但界面生成器只会再次将其替换为相同的约束)。

我认为约束应该可以帮助您更改布局和各种类型 - 即为 iPhone 5 和更早版本构建视图。此外,从纵向模式切换到横向模式。

我似乎根本无法让它工作。如果我添加一个视图并将其放在超级视图的顶部下方,那么它将设置一个Top space to: 约束。这将是一个像素值,这意味着当我在较短的 iPhone 4 上查看时(或者如果手机变成横向),这些元素不会自动向上移动。

例如,我正在尝试创建一个自定义键盘视图 - 类似于您在收银机上看到的。我创建了一个自定义 UIView 子类,现在我将一个 UIView 放入界面构建器中。我已经设置了高度和宽度并将其定位在视图的底部(它“点击”到位)。界面生成器如何添加Top space to 约束,将其置于该高度(iphone 5)。因此,如果我在 iPhone 4 上查看它,它不会向上移动(正如我所料,因为我将它“卡入”到屏幕底部的位置)而是切断了底部。

这不是我想要的,但是(如上所述)不幸的是我无法删除约束。

我能做什么?我知道我可以只创建两个 nib 文件(适用于 iPhone 5 和其他 iphone),但是当我想要在手机横向切换时自动调整时怎么办?

感谢您的帮助

【问题讨论】:

【参考方案1】:

您不能在 Interface Builder 中删除约束,如果这样做会留下没有足够的约束来确定完全任何界面小部件的大小和位置

一种解决方案:添加更多约束,直到大小和位置超确定。然后,您将能够删除多余的约束之一。例如,你举了这个例子:

我已经设置了高度和宽度并将其定位在底部 视图(它“点击”到位的位置)。界面生成器如何添加 将其置于该高度的顶部空间(iphone 5)。因此,如果 我在 iPhone 4 上查看它并没有让步(正如我所料,正如我 将其“卡入”到屏幕底部的位置),而是剪切 离开底部。

选择视图并选择 Editor > Pin > Bottom Space to Superview。现在你有比你需要的更多的约束:高度,宽度,确定水平位置的东西(你忘了提到),以及超级视图顶部的引脚和超级视图底部的引脚。因此,您可以现在删除顶部的图钉。

另一种解决方案:删除代码中不需要的约束。约束是一个普通的接口对象,因此您可以为它创建一个出口,并在您的代码运行时将其移除。但是,如果您这样做的方式是未确定大小或位置,则会得到不可预知的结果(“模糊布局”),所以要小心。

还有另一个解决方案:降低 IB 中不需要的约束的优先级。 Interface Builder 将确保所有值都是绝对确定的。但也许你知道,例如,superview 会改变大小,因此 Interface Builder 创建的一些约束是不受欢迎的。您不能删除它们,但可以降低它们的优先级。因此,在您的示例中,您最终可能会得到一个顶部的 pin 和一个底部的 pin,但您可以将 pin 的优先级降低到顶部。

【讨论】:

【参考方案2】:

对我来说不明显的是,如果值得更多麻烦,您可以在每个 nib 文件的基础上关闭此新功能。

选择 nib 文件并选择文件检查器(视图->实用程序->显示文件检查器)并取消选择“使用自动布局”。

【讨论】:

问题是使用约束。我认为托马斯确实真的想禁用它。 这对我很有帮助,我想票的作者也会觉得它有帮助。你可以从他写作时的语气看出,他对这些限制一点也不满意,宁愿没有它们也不愿试图让它们屈服。【参考方案3】:

如果您在不同的屏幕尺寸上遇到此问题,它在 iPhone 5 屏幕上构建良好,但在 iPhone 4 屏幕上却不行,反之亦然,一种解决方案是关闭违规视图的“自动调整子视图”选项,并然后单击窗口右下角的按钮,该按钮显示您的故事板/笔尖,它可以更改屏幕尺寸,并确保两种屏幕尺寸的一切看起来都很好。当我用代码构建东西并避免像这样的 IB 怪事时,这只是让我高兴的另一件事。

【讨论】:

以上是关于在界面构建器中使用约束的主要内容,如果未能解决你的问题,请参考以下文章

将图像添加到界面构建器中的按钮

如何在界面构建器中使用框架中的 UIView 子类

如何使用情节提要在界面构建器中连接自定义 UIView?

@2x 图像不显示在 XCode4 界面构建器设计器中

需要时以编程方式添加滚动

约束未能添加填充