ios 约束(三)

创建约束规则

    通过NSLayoutConstraint类,开发者可以用两种方式来创建约束规则。可以用一个相当长的方法调用语句来指明视图的某个属性与其他属性之间的关系,并描述这些属性之间的联系,也可以用一种写起来非常短小的格式化语言来指定视图在水平方向与垂直方向上的排布形式。

    记住:无论怎么样构建约束规则,他们所产生的结果都是类似“y关系mx + b”这样的关系式。不论创建了何种约束规则,他们都是NSLayoutConstraint类的成员。

 1、基本约束规则声明

    NSLayoutConstraint类的constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:方法一次能够创建一条约束规则。这些规则可以把一个视图同另一个视图关联起来。

    这个方法会创建出严格的”view.attribute R view.attribute * multiplier + constant“关系式。其中R可以是”等于(==)、大于等于(>=)、小于等于(<=)“。

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_textfield attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];

    这段代码会向视图控制器的视图里添加一条新的约束规则,它会把文本框中心点的横座标与本视图中心点的横座标对齐。具体来说,就是在两个视图中心点的横座标之间设立等同关系。放大倍数是1,偏移量是0.这就产生了上面的关系式。

    这个关系式的意思是:请把本视图中心点的X座标与文本框中心点的X座标对齐。UIView的addConstraint:方法会把这条约束规则添加到视图之中,该规则与其他的约束规则都会存放在视图的constraints属性里。

2、用可视化格式字符串声明约束规则

    NSLayoutConstraint类里还有个方法,可以根据字符串来创建约束规则,这种字符串使用基于文本的视觉格式语言来表示其内容。这就好比给OC语言高手设计的一套ASCII看下面例子:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[leftLabel]-25-[rightLabel]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(leftLabel,rightLabel)]];

    上面的这行代码会根据可视化格式字符串的内容创建出一套约束规则,以满足其中的关系。它们用来表述视图的横轴(H)与纵轴(V)方向上与其他视图的关系。本例所用的这个字符串的意思就是说:确保rightLabel出现来leftLabel下方15点处。

    创建这种格式字符串的时候要注意下面这些事项:

    1、先用H:或V:前缀来指明规则所针对的轴。

    2、字符串里指代视图的变量名都用方括号括起来。

    3、两控件之间的固定间距用左右带“-”的常量来表示,例如-15-。

    4、本例没有使用选项(options参数),不过开发者可以借此来指定对齐的方向是从左至右、从右至左还是从头至尾。

    5、本例也没有使用metrics参数,开发者可以把一份字典穿进去,并在其中提供一些约束规则所用到的常量,这样就不用再去专门创建相关的格式字符串了。比方说,我们想令两个文本标签之间的间距可变,那么请将本例中的15替换成某个指标的名字,然后把该指标的值放在metrics字典里面。字典的键是指标的名称,而值的类型则是NSNumber。传入这样一个字典比每次用到一种宽度时都去创建新的NSString实例要简单许多。

    6、views:参数的实际意义与其名称不同,他不是个包含视图的数组。我们要给该参数传入含有变量绑定的字典。这种字典会把作为变量名的字符串与变量所指代的视图关联起来。执行了这样一种操作之后,开发者就可以在格式字符串里使用诸如leftLabel及rightLabel等有意义的符号了。

    用格式字符串来构建约束规则时,总会产生一个包含若干约束规则的数组。某些格式字符串相当复杂,另外一些则比较简单。我们不太容易看出来每个字符串到底会产生多少约束规则。请注意:constraintsWithVisualFormat方法会制作出能够满足格式字符串的一系列约束规则,而开发者要把这些规则全都添加到视图里面去。

3、变量绑定

    Auto Layout系统在处理可视化的约束字符串时,需要把leftLabel及rightLabel等视图名称与它们所表示的实际视图对应起来。这是就需要用到变量绑定了,我们通过NSLayoutConstraint.h文件里定义的宏来执行变量绑定,该文件是UIKit中的一个头文件。

    NSDictionaryOfVariableBindings()宏以任意数量的局部变量作为参数。正如大家在早前的范例汇总所看到的,这些参数最后不需要添加上nil。该宏会根据传入的变量构建一份字典,其中每个条目的键都是变量名,而值则是变量本身。比方说,如果执行下面这条语句:

NSDictionaryOfVariableBindings(leftLabel,rightLabel)

    如果你不想使用这个宏,那么不妨手工制作一份字典,并把它传给使用可视化格式字符串的约束规则构建器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章