如何修复 missing/conflicting 使用不同尺寸时 wAny hAny 的约束 类

How to fix missing/conflicting Constraints for wAny hAny when using different Size Classes

我想要达到的目标

我想为所有常规高度垂直排列两个等高的视图。但是,对于 Compact Heights,我希望将视图水平排列。如下图所示:

为此,我在适用于所有内容的 wAny-hAny 大小 class 中添加了一般约束。然后我为 wAny-hRegular 和 wAny-hCompact 大小 classes 添加了特定约束。这对 wAny-hRegular 和 wAny-hCompact(以及在模拟器中测试应用程序)来说效果很好,但它让我在 wAny-hAny 中缺少约束。如果我在 wAny-hAny 中添加那些缺失的约束,那么我会在 wAny-hRegular 或 wAny-hCompact 中得到冲突的约束。我不知道如何摆脱这些错误。

下面是我所做的更详细的解释。

我是如何尝试的

通过执行以下步骤,我能够获得在模拟器中运行的东西。

wAny hAny

对于任意宽度任意高度,我设置了以下 4 个约束:

也就是说,我将蓝色固定在顶部和左侧,将红色固定在右侧和底部。无论使用什么大小 class,这些约束总是需要的。

wAny hRegular

对于 Any Width Regular Height 我添加了以下 4 个约束:

也就是说,我把蓝色固定在右边,红色固定在左边。我还将红色的顶部边缘固定到蓝色的底部边缘。我让红色和蓝色的高度相等。这解决了常规高度的所有约束问题。

wAny hCompact

对于 Any Width Compact Height 我添加了以下 4 个约束:

也就是说,我把蓝色固定在底部,红色固定在顶部。我还将红色的右边缘固定到蓝色的左边缘。我让红色和蓝色的宽度相等。这解决了 Compact Height 的所有约束问题。

问题

通过上述设置,在 Storyboard 预览(见上图第一张)和我测试过的所有尺寸的模拟器中一切正常。

但是,在 Interface Builder 中,我收到以下有关 wAny hAny 大小 Class:

的缺少约束错误

这有点像第 22 条军规,因为如果我尝试添加缺少的约束,那么我会创建与常规或紧凑大小 Class 约束相冲突的约束。这里以 Compact 为例:

如何解决这个问题?

这是因为在两种不同大小的 class 中,单个视图有两种不同的约束。因此,宁可解决 missing/conflicting wAny hAny 使用不同尺寸时的约束 类 的问题,请尝试从 wAny hAny 尺寸 class 中卸载附加约束,这些约束已添加到 wAny hCompact 或任何其他尺寸 class.

你可以这样做:

步数:

  1. 如果实用程序区域未打开,请选择“查看”>“实用程序”>“显示实用程序”。
  2. Select 包含您要更改的约束的视图。
  3. Select 您要安装或卸载的约束。约束检查器在实用程序区域打开。
  4. 在约束检查器中,单击已安装 属性 旁边的添加按钮 (+),然后从弹出菜单中选择所需的大小 class。

从弹出菜单中选择大小 class 后,约束检查器中会出现该大小 class 的新条目。

注意:如果已经存在所需尺寸的条目项class,请跳过此步骤。

  1. Select 所需输入行的复选框以安装该大小的约束 class。取消选中复选框以卸载约束。

仍会为已卸载的约束创建运行时对象。但是,它不包含在视图层次结构中。

约束检查器显示一个或多个条目项,显示约束是否已安装或未安装大小 class。大小 class 的每个条目行都以删除按钮 (x) 开头,后跟大小 class,然后是选择复选框。宽度 (w) 和高度 (h) 显示尺寸 class。 C 用于紧凑尺寸 class,R 用于常规尺寸 class,Any 用于任意尺寸 class.

你可以找到详细的解释apple document on installing and uninstalling constraint for size classes

我认为您只需要为 wAny-hCompact 大小 类 添加特定约束。并确保正确安装特殊约束。

见下图。

借助 xcode 7 及更高版本提供的 UIStackView 可以轻松实现您所需要的一切。

Apple Documentation of UIStackView

A good Tutorial on UIStackView