Auto Layout 和 Constraints

red 9年前

来自: http://segmentfault.com/a/1190000004386278

自动布局Auto Layout

Auto Layout通过通过设置在View上的约束,动态计算视图层次结构中所有的View的尺寸和位置。举个栗子,你约束一个Button,令它的水平中心线和一个ImageView相同,并且它的上边缘距离ImageView的下边缘有8个像素。如果ImageView的尺寸或者位置改变,Button会自动调整,以符合之前设置的约束。

这种基于约束的设计,允许我们搭建能够动态响应内部和外部变化的用户界面。

外部变化

外部变化发生于superview的尺寸或者位置改变,比如,

  • 设备屏幕旋转

  • 支持不同屏幕大小的设备

这时,所有的View都要重新计算尺寸和位置。每一次变化,都会刷新视图层级结构的布局。这些变化大部分发生在运行时,它们需要APP能够动态响应。

内部变化

内部变化发生于你的界面中的View的尺寸或者位置发生改变。比如,

  • APP中显示的内容的改变,新的内容可能需要一个新的布局。一般,在显示文字或者图片时会出现这种情况。

  • APP支持动态设置。如果用户可以设置字体大小,这将会改变任何与文本相关的控件的高度或者宽度,布局必须能够适应变化。

约束Constraints

Auto Layout的实现是基于设置在View上的一系列约束的。每一条约束都是一个表达式。

下图是官方文档给的示例图:

这个约束表明, Red View 的 左边缘 与 Blud View 的 右边缘 的距离为8。这个等式由以下几个部分组成:

  • Item 1:表达式中的第一个物件。在这个例子中是 Red View 。

  • Attribute 1:第一个物件的一个属性。在这个例子中是 Red View 的 leading edge 。

  • Relationship:表达式左右两边的关系,可以使 等于 , 大于等于 或者 小于等于 。在这个例子中,两边的关系是相等的。

  • Multiplier:和第二个物件的属性相乘的乘数,是一个浮点型。在这个例子中是 1.0 。一般情况下,这个值不可置为 0.0 。

  • Item 2:表达式中的第二个物件。在这个例子中是 Blue View 。它是可以为空的,即表达式变成 Item 1 * Attribute 1 = 0.0 * NotAnAttribute + Constant 。

  • Attribute 2:第二个物件的一个属性。在这个例子中是 Blue View 的 trailing edge 。

  • Constant:一个浮点型的常数。在这个例子中是 8.0 。

大部分的约束是定义两个物件之间的关系。这些物件必须是 View 或者 Layout Guide 。约束也可以定义一个物件的两个属性之间的关系,比如设置一个物件的高度或者宽度。当第二个物件为空时,它的属性必须被设为 Not An Attribute ,并且 Multiplier 为置为 0.0 。

约束中用到的属性

通常情况下,包含四个边(leading,trailing,top和bottom),以及高度(height),宽度(width),水平中心点(CenterY),垂直中心点(CenterX)。文本类型的物件还有一个基线(baseline)属性。

属性说明

  • Height和Width。这两个属性可以被直接赋值,可以是一个常数,也可以是其他View的Height或者Width值。但是,不可以为负数。

  • Top、Bottom、Baseline。可以和 Top 、 Bottom 、 Baseline 、 CenterY 组合。

  • Leading和Trailing。可以和 Leading 、 Trailing 、 CenterX 组合。

  • Left和Right。避免使用这两个属性,而使用 Leading 和 Trailing 来替代它们。

  • CenterX和CenterY。CenterX可以和 Leading 、 Trailing 、 Left 、 Right 组合。CenterY可以和 Top 、 Bottom 、 Baseline 组合。

使用属性定义约束

上面提到的属性可以分为两类, 尺寸相关 和 位置相关 。尺寸相关(如height、width)用来定义物件的大小。位置相关(如leading,top)的属性用来表明该物件和其他物件之间的位置关系。使用这些属性时需要注意:

  • 不要使用尺寸相关的属性去约束一个位置相关的属性。

  • 只可以给尺寸相关的属性直接赋值一个常量。

举几个简单的例子:

// 设置一个固定高度  View.height = 0.0 * NotAnAttribute + 40.0    // 设置两个按钮之间的固定距离  Button_2.leading = 1.0 * Button_1.trailing + 8.0    // 让两个按钮的左边缘对齐  Button_1.leading = 1.0 * Button_2.leading + 0.0    // 给两个按钮相同的宽度  Button_1.width = 1.0 * Button_2.width + 0.0    // 让View的中心和父类的中心相同  View.centerX = 1.0 * Superview.centerX + 0.0  View.centerY = 1.0 * Superview.centerY + 0.0    // 设置一个View的宽高比  View.height = 2.0 * View.width + 0.0

约束的设置没有最好的,只有最适合的。

约束的优先级

优先级是Auto Layout在计算的时候用到的参数。优先级的值可以是1-1000任意整数。系统定义了low(250)、medium(500)、high(750)和required(1000)四个等级。一般情况下,我们手动设置的优先级的值也会集中在这四个等级下。

关于Auto Layout是如何通过优先级来计算出解决方案,我在看完官方文档后还是一头雾水。希望有大神可以指点一二。

参考内容:

苹果官方文档: Auto Layout Guide

</div>