我下载了新的Xcode,在Interface Builder中遇到了许多问题,警告提示如下: 固定宽度约束可能会导致裁剪 情况看起来像这样: 我的应用程序对几种语言进行了本地化,并且我理解警告,即标签的大小可能会在另一种语言中发生变化,但我的应用程序没有这个问题。我昨天在Xcode 8中运行和测试过它,一切正常。我不想花费数小时添加无意义的新约束。 有什么建议的解决方法吗?
即使我的应用程序中没有多个语言,我仍然收到相同的警告,这让我找出了到底发生了什么。这里有几件不同的事情,我能够通过将对象间距的宽度从固定宽度更改为大于或等于或小于或等于来消除自己应用程序中的固定宽度警告。可以通过在界面构建器中选择对象,进入大小检查器并在那里进行更改来完成此操作: 或者,从文档大纲中选择约束,转到大小检查器,并在那里进行更改: 至于您屏幕截图顶部的警告:引用: 固定前导和尾随约束与中心约束可能会导致剪切以下是我自己的应用程序中获取完全相同警告的屏幕截图: 我将带有@符号的标签设置为前导和尾随按钮,但也要对齐中心与评级标签。一旦我删除了居中对齐约束,警告就消失了,但是我留下了一个布局不当的对象集。然后我决定接受Stack View。虽然使用起来很烦人,但是当您正确地获取所有约束和设置时,它会美丽且没有警告。编辑 正如Repose在评论中所写,有时候只需添加 >= 0 就可以了,因为这样可以确保两个元素不重叠。
您可以尝试在每个约束条件上禁用“Respect Language Direction”来消除警告,并查看是否有所帮助。选择您的约束条件并打开属性/大小检查器。请参见附图。如果您不打算将应用程序本地化到其他语言,则此解决方案不应具有任何缺点。对于本地化的应用程序,您必须更加注意标签和字体大小。附注:此解决方案适用于iOS。 对于macOS,请尝试使用> =或<=来消除警告。附注二:使用AutoLayout和单个UILabel或UITextView上的attributedString属性以及NSMutableAttributedString可以更轻松地创建下面图片中的标签。 该图像仅供演示目的。
对于本地化的标签和按钮,这个警告是有意义的,你应该提供必要的约束条件,使你的标签不会重叠。如果它们现在没有重叠,未来可能会出现重叠,因此提供约束条件不会有坏处。 Xcode 可以帮助你自动添加这些约束: 在 storyboard 的文档大纲中,单击黄色箭头,然后选择 "固定前导" 或 "固定尾随",具体取决于文本在屏幕上的位置(左侧还是右侧)。这将为大多数问题修复。 如果你遇到了一个没有任何文本的按钮(只有图片),尝试移除设置给按钮的 "默认标题":
Swift 4,Xcode 9.1: 关于这个问题,我认为您的对象不知道在其父视图上下文中正确的中心位置,使用移除,大于或其他前导/尾随设置大多数时候不能正确工作。首先,您必须检查父视图的正确约束。 如果您的父视图已正确设置,您可以通过设置"水平于容器"约束来"解释"给您的对象在视图中的正确位置:
当我从Xcode 9迁移时,遇到了同样的问题,并找到了一种对于某些布局有用的方法。在我的情况下,我想要一个表头,其中两列(UILabels)具有固定宽度,另一列具有可变宽度。无论我如何指定列宽(包括使用大于或等于约束而不是相等等),我都会收到可能剪切的警告。在我的情况下,我希望可变宽度列(UILabel)在必要时进行剪切。我可以忽略警告,但不喜欢那样做。在这里有效的方法是创建一个UIView,具有适当的大小约束,并将UILabel作为子视图嵌入UIView中。然后,如果需要,就会发生截断,我就不会收到警告。无论UIView /嵌入式UILabel是否在StackView中,此方法都适用。这本质上与Haroldo Gondim的方法相同,但在这里您可以看到它也适用于具有或不具有StackView的情况。以下图像显示了该方法,有或没有StackView。“SpacerName”是一个包含标签的可变宽度UIView,“SpacerPD”是一个固定宽度为80的UIView。[颜色不重要;只是为了显示视图的位置。]
我曾经遇到同样的问题,但当我改为使用>=时,它会自动将常量设置为0。例如,如果我选择60,警告会再次出现。所以我一直陷入这个问题的循环中。我可以通过将我的Label嵌入到一个View中来解决这个问题。Editor > Embed In > View 在标签中,我使用 constant = 0 设置了 Top、Bottom、Leading 和 Trailing。 在 View 中,我设置了之前预期的 constraints。