oc 自动布局与可视化格式语言

概述

大多数UI组件的定位可以使用下面的公式来解决:

1
obj1.propery1 = obj2.property2 * multiplier) + constant value

约束是相对于父视图的一个概念

1
2
3
4
5
6
7
8
9
// 约束使用NSLayoutConstraint的类方法来创建:

[NSLayoutConstraint constraintWithItem:(nonnull id) //表示上述公式的obj1
attribute:(NSLayoutAttribute) //代表公式中的property1
relatedBy:(NSLayoutRelation) //代表公式中的等号,可以设置为其他值
toItem:(nullable id) //代表公式中的obj2
attribute:(NSLayoutAttribute) //代表公式中的property2
multiplier:(CGFloat) //代表公式中的乘号
constant:(CGFloat)]; //代表公式中的约束值

当创建完约束之后,就可以便捷的把它们添加到适当的视图中,使用以下UIView类方法:
addConstraint和addConstraints。

使用可视化格式语言

在表述约束的格式化字符串中,使用H:指定水平排列,使用V:指定垂直排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
UITextField *textFieldEmail = [[UITextField alloc] init];
UITextField *textFieldConfirmEmail = [[UITextField alloc] init];
NSMutableArray *constaints = [NSMutableArray array];

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(textFieldEmail, textFieldConfirmEmail);
//NSDictionary *viewsDictionary = @{@"textFieldEmail" : textFieldEmail};
[constaints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[textFieldEmail]-|"
options:0
metrics:nil
views:viewsDictionary]];
[constaints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[textFieldEmail]"
options:0
metrics:nil
views:viewsDictionary]];
[constaints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[textFieldConfirmEmail]-|"
options:0
metrics:nil
views:viewsDictionary]];
[constaints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:[textFieldEmail]-[textFieldConfirmEmail]"
options:0
metrics:nil
views:viewsDictionary]];

[self.view addConstraints:constaints];