Xcode 9-“固定宽度限制可能导致剪切”和其他本地化警告

我下载了新的 Xcode,Interface Builder 上我遇到了很多警告的问题,比如:

固定宽度限制可能导致剪切

它看起来像这样:

enter image description here

我有几种语言的本地化,我理解的警告,在另一种语言的标签的大小可能会改变,但我的应用程序没有这个问题。我昨天在 Xcode 8中运行并测试了它,它没有问题。我不想浪费时间去添加毫无意义的新约束。

有什么建议吗?

65436 次浏览

您可以尝试禁用“尊重语言方向”的基础上每个约束的警告,看看它是否有帮助。选择约束并打开属性/大小检查器。请看附图。

如果您不打算将您的应用程序本地化为其他语言,那么这个解决方案应该没有任何缺点。对于本地化的应用程序,你必须更加注意你的标签和字体大小。

此解决方案适用于 iOS。

下图中的标签使用 AutoLayout 和 AttributedString 属性在单个 UILabel 或使用 NSMutableAttributedString 在 UITextView 上创建起来要容易得多。该图像仅用于演示目的。

Disrespect Language Direction

我得到了相同的警告,甚至 没有多种语言在我的应用程序,这导致我发现什么是真正发生的. 。

这里发生了一些不同的事情。我能够在我自己的应用程序 静音固定宽度警告通过改变的 对象间距的宽度从固定宽度到 大于或等于小于或等于

这可以通过在 Interface Builder 中选择对象,到尺寸检查器那里并在那里改变它来实现:

enter image description here


或者,从文档大纲中选择约束,转到大小检查器,并在那里更改它:

enter image description here



至于截图顶部的警告:

固定的带中心约束的前导和尾随约束可以 导致剪切

下面是我自己的应用程序截图,其中我得到了完全相同的警告:

enter image description here

我的标签上有“ 设置为引导和尾随到按钮,但也对齐中心与评级标签”的标志。一旦我 移除了中心对齐约束,警告消失,但我留下了一个不适当的布局对象集。

就在那时,我接受了 拥抱堆栈视图。尽管使用起来很烦人,但是当您正确地设置了所有的约束和设置时,它的布局非常漂亮,而且没有任何警告。


剪辑

正如 休息在注释中所写的那样,有时只需添加 > = 0即可,因为您要确保两个元素不会重叠。

对于本地化的标签和按钮,这个警告是有意义的,您应该提供必要的约束,这样您的标签就不会重叠。如果它们现在没有重叠,将来可能会重叠,所以提供约束也没什么坏处。

Xcode 帮助您自动添加这些约束:

在故事板的文档大纲中,点击黄色箭头,根据文本在屏幕上的位置(左边或右边) ,选择“固定前导”或“固定尾随”。这将解决大多数问题。

Xcode screenshot

如果您有这个问题与 没有任何文字的按钮(只有图像) ,尝试删除“默认标题”,这可能仍然被设置为按钮:

Xcode screenshot

使用 Labels,您可以将 Lines设置为 0,将 Autoshrink属性设置为 Minimum Font Size,以删除 Fixed Width Constraints May Cause Clipping警告,如下所示:

enter image description here

我有同样的问题,但当我改为 >=它自动设置为 0常数,如果我选择 60为例,警告再次出现。所以我对这个问题了如指掌。

我可以修复嵌入我的 Label在一个 View

Editor > Embed In > View

Label中,我用 constant = 0设置 TopBottomLeadingTrailing

constraints

View中,我设置了我以前期望的 constraints

Swift 4 Xcode 9.1:

关于这个问题,我认为您的对象 不知道什么是正确的中心位置,在它的上下文的超视图,并使用 大于或其他领先/处理设置大多数时候不能正常工作。首先,您必须检查管理视图的正确约束。

如果您的超视图/s 设置正确,您可以尝试通过设置 “水平集装箱”约束向您的对象“解释”视图中的正确位置:

enter image description here

我在转移到 Xcode 9时遇到了同样的问题,并且发现了一种对某些类型的布局非常有用的方法。在我的示例中,我需要一个表头,其中两列(UILabels)的宽度是固定的,另一列的宽度是可变的。不管我如何指定列宽(包括使用大于或等于而不是等于的约束,等等) ,我一直得到关于可能的剪辑的警告。在我的例子中,我希望可变宽度列(UILabel)在必要时剪辑。我可以无视警告,但我不喜欢这么做。

这里工作的方法是创建一个具有适当大小约束的 UIView,并将 UILabel 作为子视图嵌入到 UIView 中。如果有必要,就会发生截断,而我没有得到任何警告。无论 UIView/嵌入的 UILabel 是否位于 StackView 中,这都是有效的。

这与 HaroldoGondim 的方法本质上是相同的,但是在这里您可以看到,不管有没有 StackView,它都可以工作。

下图显示了使用和不使用 StackView 的方法。“ SpacerName”是一个包含标签的可变宽度 UIView,而“ SpacerPD”是一个固定宽度为80的 UIView。[颜色并不重要; 只是用来显示视图所在的位置。]

enter image description here

我知道这个问题已经得到了回答,但是在我的例子中,我所做的修复这个错误的方法是添加“长宽比”属性,然后消除宽度或高度的限制,这个方法工作得很好,而且花费的精力也更少,我设法保持相同的输出,并针对不同的设备调整我的视图。

正如你在下面的图片中看到的,我有一个错误 “固定宽度限制可能导致剪切”,因为虽然我已经设置我的文本框垂直居中,我的标签有一个左边距约束,我没有定义一个约束的文本框相对于标签,所以 XCode 提醒我,文本框可以剪切(被渲染上面)的标签。

enter image description here

在将左侧约束添加到文本框之后,始终与标签保持一定的距离,这个错误被认为是由 XCode 解决的,它不再用约束警告来烦扰我。

我有一个类似的问题时,尝试有相同的填充按钮从边缘的超级视图。

Error case

我最终对 super view使用了 horizontal center约束和 equal widths约束。

My solution

另一个快速解决方案!

对于一个 UIButton,将标题从纯文本改为属性文本也解决了我的问题:-

enter image description here

修正错误 : 固定宽度限制可能导致剪切”和其他定位 您需要选择视图/对象,进入“显示大小检查器”,找到宽度约束,并将常量设置为大于或等于:

Size Inspector

修正错误 : 缺少引导/拖尾约束,这可能导致与其他视图重叠

这意味着 Xcode 所抱怨的视图/对象缺少对邻近视图的引导或拖尾约束。

持有控件时,将其拖动到附近的视图/对象

Contrl + PressClick

添加引导约束或尾随约束

Leading/Trailing Constraint

如果按钮需要固定宽度约束,只需将宽度约束优先级设置为 700