Xcode 13.0 中的不明确布局警告

Ambiguous layout warnings in Xcode 13.0

启动 Xcode 13.0 后,我在应用程序上收到大量 Position and size are ambiguous for ...Width and horizontal position are ambiguous ... 布局警告,这些警告在以前的 Xcode 版本中没有出现几天前(Xcode 升级后我没有做任何更改)。提到的对象在设备和模拟器上正确显示。仔细检查,发现所有约束似乎都已正确设置。

上面的例子非常简单。我真的不明白警告的原因可能是什么。

更奇怪...当我更改表格视图顶部某处的标签名称时,大部分警告(不是全部)都消失了。此标签位于与生成警告的对象完全无关的单元格中。重新启动后 Xcode,警告又回来了。

另外 Update Frames 也没有解决问题。

这是 Xcode 错误还是我错过了什么?

--- 更新 1 (20.10.2021) ---

  1. 我注意到 Main.storyboard 显示有关对象的 ambiguous="YES"。手动删除(当 Xcode 13.0 关闭时)没有帮助。 ambiguous="YES" 将在下一次 Xcode 开始时返回。

  2. 我注意到所有警告都涉及对象的约束,位于表格视图单元格 16 之后向下(分布在 4 个部分)。这不可能是巧合。

tableview and/or 部分中允许的单元格数量是否有任何限制?

--- 更新 2 (21.10.2021) ---

更多细节。经过大量测试和阅读仍然没有解决方案。

整个问题是关于一个表视图控制器,它有 7 个部分,单元格数量可变(2、2、1、12、1、3、2)。警告仅在第 4 部分的第 11 单元格之后显示,因此第 16 单元格从顶部开始计数(忽略部分边界)。

Xcode 在 change/impact 关系方面表现出许多不连贯性,如下所示。

  1. 有一个禁用警告的设置(TARGETS > Build Settings > IBSC_WARNINGS),但这不会改变显示的警告数量。手动(折旧)删除 Main.storyboard 文件中的 ambiguous="YES" 没有帮助。我认为尝试一下没有什么不好(备份 Main.storyboard 之后)。这个问题可能归结为为什么 Xcode 首先将不明确的标签添加到 Main.storyboard

  2. 该项目在选项卡栏的右上角显示黄色警告符号,以及 target/device 栏右侧的 10 个警告(Xcode window).单击该按钮会打开显示 10 条警告的问题导航器。然而,故事板显示了相关表视图控制器的红色错误符号。在这个列表中,只有错误而没有警告(那么现在,错误还是警告?)。该数字是 16 个错误,而 Xcode 顶部栏中的警告数显示 10 个警告。尝试 Add missing constraints 没有任何作用。我手动添加的约束显然是正确的。请参阅 OP(重置设置)的简单示例。 Xcode window.

    中有很多相互矛盾的信息
  3. 更改属于发出警告的单元格(例如单元格#16)的开关的文档标签(身份检查器),警告总数下降到 0!此标签仅供 Xcode 故事板界面使用,不会显示在应用程序 UI 上。那么为什么它会对约束警告产生影响呢?不相关的改变解决了问题?

  4. 如果由于上面的 (3.) 警告计数为 0,则重新启动 Xcode 会将所有恢复到之前的状态 = 10 个警告。为什么更改设置后出现 0 个警告,然后在重新启动后再次出现 10 个警告?

  5. 如前所述,混乱始于单元格 #16。然而,这是来自单元格 #15 的 copy/paste,它不会生成任何警告。

  6. 视图调试(框架、对齐矩形)正确显示界面 - 在设备和模拟器上。

当应用程序运行时,布局实际上完全按照设计显示。这些警告似乎对实际操作没有任何影响。他们也没有显示之前 Xcode 13.0.

网上排版模糊的问题比较多,但很少有解决方案。大多数时候,作者只是接受了滋扰而辞职。我的目的是了解为什么会出现这些问题并解决潜在的隐藏问题(如果有的话)。

我在我的应用程序中发现了同样的错误。它发生在 TableView Controller 的静态单元格中,并且仅针对向下滚动后可以到达的那些单元格出现不明确的布局警告。

我采取的删除布局警告的步骤:

  1. Select 显示自动布局警告的视图控制器
  2. 检查员 > 尺寸 > 模拟尺寸 > 自由形式(见下图)
  3. 更改高度以便显示所有单元格

现在所有警告都消失了!

Xcode 版本:13.2 (13C90)

Simulated Size image