cocoa_chen

AutoLayout之Masonry简介

2014-12-15

Masonry是一个轻量级的布局框架,它提供了更加方便和友好的API来替代NSLayoutConstraint进行自动布局(AutoLayout)编程,使得在手写代码布局时更加轻松方便。

使用简介

首先做一个简单的布局,创建一个视图距离父视图的各边界为10像素。我们会用NSLayoutConstraint和Masonry实现同样的布局来比较一下。先是用官方的NSLayoutConstraint:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
UIView *superview = self;

UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor = [UIColor greenColor];
[superview addSubview:view1];

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[superview addConstraints:@[

//view1 constraints
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:padding.top],

[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:padding.left],

[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:-padding.bottom],

[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeRight
multiplier:1
constant:-padding.right],

]];

可以看出这么简单的需求就需要这么多的代码,就算用VFL来写,也还是会显得有些冗长。下面再看看同样的约束用Masonry写出来的效果:

1
2
3
4
5
6
7
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).offset(padding.top);
make.left.equalTo(superview.mas_left).offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).offset(-padding.bottom);
make.right.equalTo(superview.mas_right).offset(-padding.right);
}];

或者像下面更简短的写法:

1
2
3
4
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).insets(padding);
}];

对比下可以看出来Masonry可读性和简洁性更好,而且他会自动帮你调用view1.translatesAutoresizingMaskIntoConstraints = NO;,并且会自动的将约束添加到对应的视图上。难怪Masonry的作者会说让冗长的NSLayoutConstraints见鬼去吧。

Masonry还有很多强大的功能,这里就不一一写了,感兴趣的可以去Github上下载Demo了解并体验一下。

最近在项目中借鉴并使用了Masonry来进行AutoLayout的布局,感觉相当的好用。故记录下来做个引子,算是学习之路上一个小小的总结。

参考:

Tags: iOS
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章