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的布局,感觉相当的好用。故记录下来做个引子,算是学习之路上一个小小的总结。
参考: