Xcode 9 - "Fixed Width Constraints May Cause Clipping" 和其他本地化警告

Xcode 9 - "Fixed Width Constraints May Cause Clipping" and Other Localization Warnings

我下载了新的 Xcode 并且在 Interface Builder 中我遇到了很多问题,警告说的是这样的:

Fixed Width Constraints May Cause Clipping

看起来像这样:

我确实有多种语言的本地化,我理解警告,即在另一种语言中标签的大小可能会改变,但我的应用程序没有这个问题。我运行昨天在Xcode8测试了,没问题。我不想花很多时间添加毫无意义的新约束。

有什么建议的解决方案吗?

您可以尝试在每个约束的基础上禁用 "Respect Language Direction" 来消除警告并查看是否有帮助。 Select 你的约束并打开 Attributes/Size Inspector。请参阅所附图片。

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

p.s。此解决方案适用于 iOS。对于 macOS,请尝试 >= 或 <= 以消除警告。

p.p.s。下图中的标签使用 AutoLayout 和 attributedString 属性 在单个 UILabel 或 UITextView 上使用 NSMutableAttributedString 更容易创建。该图像仅用于演示目的。

即使 我的应用程序中没有多种语言,我也收到了相同的警告,这让我找出了真正发生的事情。 . .

这里发生了一些不同的事情。通过将对象间距 的 宽度从固定宽度更改为 大于等于小于等于.

这可以通过 select 在界面生成器中设置对象,转到大小检查器并在那里进行更改来完成:


或者,select 文档大纲中的约束,转到尺寸检查器,然后在那里进行更改:



就屏幕截图顶部的警告而言:

Fixed leading and trailing constraints with a center constraint may cause clipping

这是我自己的应用程序的屏幕截图,其中我收到了完全相同的警告:

我将带有 @ 符号的标签 设置为按钮的前导和尾随,但也将中心与评级标签对齐 。一旦我删除了中心对齐约束,警告就消失了,但我留下了一组布局不当的对象。

就在那时,我听天由命地 拥抱 Stack View。尽管使用起来很烦人,但当您正确设置所有约束和设置时,它的布局很漂亮并且没有警告。


编辑

正如 Repose 在评论中所写,有时只需添加 >= 0 即可,因为您要确保两个元素不重叠。

对于本地化的标签和按钮,此警告很有意义,您应该提供必要的约束,以免标签重叠。如果它们现在不重叠,将来可能会重叠,因此提供约束也无妨。

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

在故事板的文档大纲中,单击黄色箭头并选择 "fixed leading" 或 "fixed trailing",具体取决于文本在屏幕上的位置(左侧或右侧)。这将解决大多数问题。

如果 没有任何文字的按钮 (只有图像)出现此问题,请尝试删除可能仍为该按钮设置的 "default title":

With Labels, 你可以设置 Lines is 0 and Autoshrink properties is Minimum Font Size to remove Fixed Width Constraints May Cause Clipping warnings, like this :

我遇到了同样的问题,但是当我更改为>=时,它会自动将常量设置为0,例如,如果我选择60,警告会再次出现。所以我陷入了困境。

我可以修复将我的 Label 嵌入 View

Editor > Embed In > View

Label 中,我将 TopBottomLeadingTrailing 设置为 constant = 0

View中我设置了我之前期望的constraints

Swift 4 , Xcode 9.1 :

关于这个问题,我认为你的对象不知道在它的父视图上下文中它的正确中心位置是什么,并且使用remove,更大than 或其他 leading/trealing 设置在大多数情况下无法正常工作。首先,您必须检查您的超级视图的正确约束。

如果您的 superview/s 设置正确,您可以通过设置 "horizontally in Container"[ 来尝试 "explain" 您的对象在视图中的正确位置是什么=23=]约束:

我在转向 Xcode 9 时遇到了同样的问题,并找到了一种对某些类型的布局有用的方法。在我的例子中,我想要一个 table header,其中两列 (UILabels) 的宽度是固定的,另一列的宽度是可变的。无论我如何指定列宽(包括使用大于或等于而不是等于的约束等),我都会不断收到有关可能裁剪的警告。就我而言,我希望可变宽度列 (UILabel) 在必要时进行剪辑。我本可以忽略警告,但我不喜欢那样做。

此处可行的方法是创建具有适当大小限制的 UIView,并将 UILabel 作为子视图嵌入到 UIView 中。然后在必要时进行截断并且我没有收到任何警告。无论 UIView/embedded UILabel 是否在 StackView 中,这都有效。

这基本上与 Haroldo Gondim 的方法相同,但在这里您可以看到无论是否使用 StackView,它都适用。

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

我知道这个问题已经得到解答,但我在我的案例中修复此错误的方法是添加 "Aspect ratio" 属性 然后消除宽度或高度约束,这非常有效并且更省力,而且我设法保持相同的输出并针对不同的设备调整我的视图。

正如您在下图中看到的,我遇到了错误 "Fixed Width Constraints May Cause Clipping" 因为尽管我已将我的文本框设置为垂直居中并且我的标签有左边距约束,我没有为与标签相关的文本框定义约束,所以 XCode 提醒我文本框可以剪辑(在上方呈现)标签。

在将左约束添加到文本框以始终与标签保持一定距离后,该错误被认为已被 XCode 解决,并且不再因约束警告而困扰我。

我在尝试使用超级视图边缘的相同填充按钮时遇到了类似的问题。

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

另一个快速解决方案!

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

修复错误:固定宽度限制可能导致裁剪”和其他本地化 您需要 select view/object,转到 "Show Size Inspector",找到宽度约束并将常量设置为大于或等于:



修复错误:缺少Leading/Trailing约束,这可能会导致与其他视图重叠

这意味着 view/object Xcode 正在抱怨缺少对相邻视图的前导或尾随约束。

按住控件的同时,拖动到附近 view/object



添加前导或尾随约束

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