[TOC]
当系统无法找到当前约束集的有效解决方案时,会出现不满意的布局。 两个或多个必需的约束冲突,因为它们不可能同时都是真的。
## 识别不可满足的约束
通常,Interface Builder 可以在设计时检测冲突。 在这些情况下,Interface Builder 以多种方式显示错误:
* 所有冲突的约束都以红色绘制在画布上。
* Xcode 在问题导航器中将冲突约束列为警告。
* Interface Builder 在文档大纲的右上角显示红色显示箭头。
![](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/Art/Document_Outline_With_Errors_2x.png =280x112)
单击显示箭头以显示当前布局中所有自动布局问题的列表。
Interface Builder 通常会为这些问题推荐修补程序。
> 注意
> 虽然 Interface Builder 提供的即时反馈使得创建有效布局变得更加容易,但它无法找到所有可能的布局错误。
> 例如,Interface Builder 仅在画布的当前大小处检测冲突; 但是,只有当根视图被拉伸或缩小超过某个点时(或者当内容扩展或缩小超过某个点时),才会发生一些冲突。 Interface Builder 无法检测到这些错误。
> 因此,即使您应该始终解决 Interface Builder 识别的所有问题,修复显而易见的错误也是不够的。 您仍然需要在所有屏幕尺寸,方向,动态类型大小和您打算支持的语言上执行运行时测试。
>
当系统在运行时检测到不可满足的布局时,它将执行以下步骤:
1. 自动布局标识了一组冲突约束。
2. 它打破了其中一个冲突的约束并检查布局。 系统继续破坏约束直到找到有效的布局。
3. 自动布局将关于冲突的信息和损坏的约束记录到控制台。
回退系统允许应用程序继续,同时仍尝试向用户呈现有意义的内容。 但是,从布局到布局,甚至从构建到构建,破坏约束的效果都会有很大差异。
在许多情况下,缺失的约束可能没有任何可见的效果。 视图层次结构与预期完全相同。 在其他情况下,缺少的约束可能导致视图层次结构的整个部分错位,错过或完全消失。
当他们没有明显的效果时,往往会忽略错误 - 毕竟,他们不会改变应用程序的行为。 但是,对视图层次结构或 SDK 的任何更改也可能会改变一组破坏的约束,突然产生明显破坏的布局。
因此,当您检测到它们时,总是修复不可满足的约束错误。 为帮助确保在测试期间捕获非明显的错误,请为 UIViewAlertForUnsatisfiableConstraints 设置符号断点。
## 防止不可满足的约束
不可满足的约束条件相对容易解决。 系统会告诉您何时发生不可满足的约束,并向您提供冲突约束列表。
一旦您了解错误,解决方案通常非常简单。 要么删除其中一个约束,要么将其更改为可选约束。
但是,有一些常见问题需要更详细地研究:
* 以编程方式向视图层次结构添加视图时,通常会出现不可满足的约束条件。
默认情况下,新视图将其 translatesAutoresizingMaskIntoConstraints 属性设置为YES。 当您开始在画布中绘制视图约束时,Interface Builder自动将此属性设置为NO。 但是,当您以编程方式创建和布局视图时,需要在添加自己的自定义约束之前将属性设置为NO。
* 当视图层次结构在太小的空间中呈现时,通常会出现不满意的约束。
您通常可以预测视图可访问的最小空间量并适当地设计布局。 但是,国际化和动态类型都会导致视图的内容远大于预期。 随着可能的排列数量的增长,确保您的布局在所有情况下都能正常工作变得越来越困难。
相反,您可能希望构建失败点,以便您的布局以可预测的受控方式失败。
考虑将一些必需的约束转换为高优先级的可选约束。 通过这些约束,您可以控制发生冲突时布局中断的位置。
例如,将您的故障点优先级设置为999.在大多数情况下,此高优先级约束的行为就像它是必需的一样; 但是,当发生冲突时,高优先级的约束会中断,保护您的布局的其余部分。
同样,避免将具有内容内容大小的视图视为需要的内容拥抱或压缩优先级。 通常,控件的大小是理想的故障点。 控件可以更大或更小,而不会对布局产生任何有意义的影响。
是的,有些控件只能以内在内容大小显示; 然而,即使在这些情况下,通常最好还是让一个控制点偏离几个点而不是让你的布局以不可预测的方式中断。
>原文地址
>[Unsatisfiable Layouts](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/ConflictingLayouts.html#//apple_ref/doc/uid/TP40010853-CH19-SW1)