对Autolayout的基本理解

时间:2015-03-26 00:06:31

标签: ios xcode interface-builder autolayout

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

Simple Autolayout Error

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

  • 左视图固定在屏幕的顶部,底部和左侧
  • 右视图固定在屏幕的顶部,底部和右侧
  • 两个视图之间存在水平间距约束

垂直定位由顶部和底部约束决定,没有错误,但视图都报告"缺少约束"因为他们需要约束:X位置或宽度。"

我认为左视图的X位置是通过固定在左边来确定的,并且它的宽度会增大/缩小到需要的宽度,以便在它自己和右视图之间仍然有一个空间。固定在右边。

我可以看到Autolayout如何知道哪个的观点会成长为另一个观点 - 但我认为这可以通过让一个视图更高来解决水平压缩阻力优先(或水平拥抱)。更耐受压缩或具有更高拥抱值的视图将保持与Canvas中相同的宽度,而另一视图将更改其宽度以满足约束。更改这些优先级值不会影响缺少的约束错误。

从屏幕截图中可以看出," Misplaced Views"在左边的部分中,有一个视图的预期宽度超过其画布值的两倍,还有一个视图的预期宽度为0.这与我们需要宽度约束的错误匹配,但为什么呢? / p>

我相信理解为什么这可能有助于理解更复杂的Autolayout关系。提前谢谢!

2 个答案:

答案 0 :(得分:2)

内容拥抱和抗压缩优先级仅对视图的内在内容大小应用 。您的观点没有任何内在的内容大小,因此它们不相关。 (Paulw11的评论不正确,如果视图具有内在内容大小的子视图,那么这些优先级将生效。那些子视图将具有有意义的内容拥抱和压缩阻力优先级,但包含视图不会。 )

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

否则,您需要为一个或两个视图提供显式宽度约束。如果您愿意,那些约束可以具有非必需的优先级,并且如果您提供两者,则它们的优先级可以(应该)不同,以便一个在另一个之前被打破。您甚至可以在各种优先级中应用多个宽度约束来实现各种布局。 (作为一个简单的例子,您可以创建要求视图宽度大于或等于特定量的约束。这样,具有相对低优先级的首选宽度的视图仍然会在必要时缩小以适应其他视图的更高 - 优先级首选宽度,但目前为止。)

答案 1 :(得分:2)

所有其他约束都设置得很完美。一个失踪。 在这两个视图之间设置相等的宽度。如果您没有看到所需的布局,请在这两个之间调整水平间距和红色视图的前导空间相对于超级视图蓝色的尾随空格关于superview的观点。