当约束系统具有两个或更多有效解决方案时,会出现不明确的布局。 主要有两个原因:
* 布局需要额外的约束来唯一地指定每个视图的位置和位置。
确定哪些视图不明确后,只需添加约束以唯一地指定视图的位置及其大小。
* 布局具有相同优先级的冲突可选约束,并且系统不知道应该打破哪个约束。
在这里,您需要通过更改优先级以使它们不再相等来告诉系统它应该破坏哪个约束。 系统首先打破具有最低优先级的约束。
# 检测模糊布局
与不可满足的布局一样,Interface Builder 通常可以在设计时检测并提供修复模糊布局的建议。 这些歧义在问题导航器中显示为警告,文档轮廓中的错误和画布中的红线显示为警告。 有关更多信息,请参阅识别不满足的约束。
与不可满足的布局一样,Interface Builder 无法检测到所有可能的歧义。 只有通过测试才能找到许多错误。
当运行时出现模糊布局时,自动布局会选择可能使用的解决方案之一。 这意味着布局可能会或可能不会按预期显示。 此外,没有警告写入控制台,也没有办法为不明确的布局设置断点。
因此,模糊布局通常比不可满足的布局更难以检测和识别。 即使歧义确实具有明显的,可见的效果,也很难确定错误是由于模糊还是布局逻辑中的错误。
幸运的是,您可以调用一些方法来帮助识别模糊的布局。 所有这些方法都只能用于调试。 在可以访问视图层次结构的某处设置断点,然后从控制台调用以下方法之一:
* [hasAmbiguousLayout](https://developer.apple.com/documentation/uikit/uiview/1622517-hasambiguouslayout)。 适用于 iOS 和 OS X 。在错误放置的视图上调用此方法。 如果视图的帧不明确,则返回 YES。 否则,它返回 NO。
* [exerciseAmbiguityInLayout](https://developer.apple.com/documentation/uikit/uiview/1622545-exerciseambiguityinlayout) 。 适用于 iOS 和 OS X 。在布局不明确的视图上调用此方法。 这将在可能的有效解决方案之间切换系统。
* [constraintsAffectingLayoutForAxis :](https://developer.apple.com/documentation/uikit/uiview/1622432-constraintsaffectinglayoutforaxi).。适用于 iOS。 在视图上调用此方法。 它返回一个影响沿指定轴的视图的所有约束的数组。
* [constraintsAffectingLayoutForOrientation:](https://developer.apple.com/documentation/appkit/nsview/1525968-constraintsaffectinglayout)。 适用于 OS X 。在视图上调用此方法。 它返回一个数组,其中包含沿指定方向影响该视图的所有约束。
* _autolayoutTrace。 在 iOS 中作为私有方法提供。 在视图上调用此方法。 它返回一个字符串,其中包含有关包含该视图的整个视图层次结构的诊 标记了不明确的视图,并且将具有 [translateAutoresizingMaskIntoConstraints](https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco) 的视图设置为 YES。
在控制台中运行这些命令时,可能需要使用 Objective-C 语法。 例如,在断点暂停执行后,在控制台窗口中键入` call [self.myView exerciseAmbiguityInLayout]`以调用myView 对象上的 exerciseAmbiguityInLayout 方法。 同样,键入 `po [self.myView autolayoutTrace]` 以打印出包含myView的视图层次结构的诊断信息。
> 注意
> 在运行上面列出的诊断方法之前,务必解决 Interface Builder 发现的任何问题。 Interface Builder 尝试修复它找到的任何错误。 这意味着如果它发现一个不明确的布局,它会添加约束,以便布局不再含糊不清。
> 因此,hasAmbiguousLayout 返回 NO。 exerciseAmbiguityInLayout 似乎没有任何效果,constraintsAffectingLayoutForAxis:可能会返回其他意外约束。
>原文地址
>[Ambiguous Layouts](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/AmbiguousLayouts.html#//apple_ref/doc/uid/TP40010853-CH18-SW1)