自动布局的基本理解

Basic Understanding of Autolayout

我观看了 2012 年 13 月 14 日的所有相关自动布局 WWDC 视频和 CS193P,以及来自其他几个可信来源的教程。利用这些知识和一些试验和错误,我已经能够使用 Autolayout 创建一些相当复杂的屏幕,但偶尔我会遇到一个绊脚石,这表明我对 Autolayout 的理解并不完整。因此,我重新创建了我能想到的最简单的场景来展示一个非常有用的问题:

在这种情况下,我们有两种观点:

垂直定位由顶部和底部约束确定,没有错误,但视图都报告 "Missing Constraints",因为它们 "Need constraints for: X position or width."

我认为左视图的 X 位置是通过固定在左侧来确定的,它的宽度将 grow/shrink 与它需要的一样宽,以便在它和它之间仍然有一个 space固定在右边的右视图。

我明白 Autolayout 知道哪个 视图会增长以满足另一个视图会是一个问题 - 但我认为这已解决给予一个视图更高的水平压缩阻力优先级(或水平拥抱)。更抗压缩或具有更高拥抱值的视图将保持与 Canvas 中相同的宽度,而另一个视图将更改其宽度以满足约束。更改这些优先级值不会影响缺少约束错误。

从屏幕截图中可以看出,在左侧的 "Misplaced Views" 部分中,有一个视图的预期宽度是其 canvas 值的两倍多,还有一个视图预期宽度为 0。这与我们需要宽度约束的错误相符,但为什么呢?

我相信理解为什么会这样有助于理解更复杂的自动布局关系。提前致谢!

Content Hugging 和 Compression Resistance 优先级 应用于视图的固有内容大小。您的视图没有任何固有的内容大小,因此它们不相关。 (Paulw11 的评论不正确,建议如果视图具有具有固有内容大小的子视图,这些优先级将生效。那些 subviews 将具有有意义的 Content Hugging 和 Compression Resistance 优先级,但包含视图不会。)

如果您添加具有固有内容大小的子视图并添加有效地将这些子视图的大小与包含视图的大小相关联的约束,那就足够了。

否则,您需要为一个或两个视图提供明确的宽度限制。如果您愿意,这些约束可以具有非必需的优先级,并且如果您同时提供两者,则它们的优先级可以(应该)不同,以便一个先于另一个被打破。您甚至可以在不同的优先级应用多个宽度约束来实现不同的布局。 (作为一个简单的例子,您可以创建约束,要求视图宽度大于或等于某个数量。这样,具有相对低优先级首选宽度的视图仍会在必要时收缩,以适应其他视图的更高-优先首选宽度,但仅限于此。)

所有其他约束都设置完美。一个不见了。 在这两个视图之间设置等宽。如果你没有看到你想要的布局,请调整这两个之间的 水平间距 和相对于超级视图 [=17] 的红色视图的 前导 space =] 和 蓝色视图相对于超级视图的尾随 space。