Swift 自动布局在 Xcode 9.3 中不起作用

Posted

技术标签:

【中文标题】Swift 自动布局在 Xcode 9.3 中不起作用【英文标题】:Swift Autolayout doesn't work in Xcode 9.3 【发布时间】:2018-05-20 04:03:08 【问题描述】:

这里我有两个标签要在 Xcode 中显示。 如果我不添加任何约束,它似乎很好。

无限制

在模拟器中显示

然后我需要自动布局,以便它可以在不同的设备上正常显示。但是一旦我添加了约束,他们就会把我所有的标签都移到左边的板上。怎么设置都不行。

例如,一旦我为边框设置了一个恒定的前导空格,

只有一个约束,引导空间到内容,值 15

,

我的标签跳到了边界。

跳到边界。文本字段也发生了同样的事情

这让我困惑了将近三天。我怎样才能让它工作?

更新:

我尝试添加可能的约束,约束线显示为蓝色,但是一旦我运行它,标签和文本字段就会相互覆盖。不知道有没有什么重要的东西我还丢了?

For label, I added a leading space constraint, and center vertically constraint. For textfield, I added a leading space to label, and vertical center constraint. When I ran it, they coverd

textfield covered label

【问题讨论】:

你返回的单元格高度是多少? 【参考方案1】:

当您没有约束时,ios 使用自动调整掩码中已知的东西在运行时为您创建约束,将您的视图锁定在 Interface Builder 中的任何位置。这些约束不适用于不同的内容大小或不同的设备,因此您应该始终完全约束您的 UI。

当您添加单个约束时,Interface Builder 会告诉您您的界面未正确约束(视图控制器旁边的红色箭头),如果您查看该内容,它会为您提供指导。但是,在该标签上仅使用单个约束运行应用程序意味着系统没有像正常那样应用自动调整大小的掩码,并且布局系统基本上只是在运行时将所有其他值设置为零。这包括标签的heightwidth,以及它的xy 位置。所有这些值都为零,您在这里看到的是标签的内容在0,0 处呈现,标签的高度和宽度为 0。但是,clipsToBounds 默认为 false,标签的内容仍然可见,因此如您所见。

tl;dr:您需要约束整个 UI,正如 Interface Builder 试图告诉您的那样。

【讨论】:

非常感谢您的回答。其实,我试过了。但它仍然没有很好地工作。我已经更新了问题,图片显示了运行结果。如果我仍然错过一些重要的点,你有什么提示吗? 您需要添加约束,直到 Interface Builder 停止为您提供错误指示符。它应该告诉它没有哪些约束,例如高度或宽度。 非常感谢您的宝贵时间。我会尝试跟踪接口。【参考方案2】:

您必须使用约束提供标签的位置xy。在这种情况下,您有x 的值,但没有y 的值。例如:如果要将标签在单元格中居中,可以选择标签,然后按情节提要右下角的Align按钮并选择Vertically in Container

【讨论】:

非常感谢您的评论。我试过这个。但效果不好。我已经更新了问题,其中显示的图片。我仍然想知道,但我不确定我在这个项目中丢失了一些设置。你还有其他的cmets吗?非常感谢您的宝贵时间。【参考方案3】:

通常,对于视图中的每个元素,您需要 4 个约束。宽度、高度、x 和 y。有些元素只需要 x 和 y,例如标签、开关……但有些元素需要全部 4 个。在您的情况下,您需要为标签定义 x 和 y。

我建议您观看这个 YouTube 教程,以便您更好地了解 X-Code 中的自动布局:

https://youtu.be/izES1zQjRUU

【讨论】:

非常感谢您的建议。我会检查这个。

以上是关于Swift 自动布局在 Xcode 9.3 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自动布局在 iphone6 模拟器的 xcode 中不起作用

Xcode 自动完成功能在 Swift 游乐场的 Sources 文件夹中不起作用

堆栈视图中的自动约束冲突、Swift 2、iOS 9.3、XCode 7

NSKeyedArchiver 在 Swift 3 (Xcode 8) 中不起作用

“图像文字”命令在 Xcode 中不起作用

Swift 开发的代码在 Xcode 8.x 或 Xcode 7.x 中不起作用