Masonry是一个布局框架。
下载地址:https://github.com/Masonry/Masonry
安装到项目的时候,最好是用CocoaPods集成,CocoaPods用法前面已经讲过了,不会的童鞋可以翻到前面去看下。
我们先来看一个简单的例子,Masonry官方提供的,来简单看一下Masonry的方便之处:
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],
]];
用Masonry添加同样约束代码如下:
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
或者一句代码
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
那我们就一点点的去分析,为什么Masonry可以这么简便的做到这些。
我们先看mas_makeConstraints这个方法:
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}
block内部创建constraintMaker,接着插入block中当参数,并执行install方法,确保约束能添加到相应的视图上。
make.edges.equalTo(superview).with.insets(padding);
make:MASConstraintMaker
edges:需要添加约束视图的边缘,相对于equalTo(superview)来说。
with:点进去可以看到返回的是self,这样是masonry的语法更清晰。
insets:需要添加约束的条件。参数为padding,也就是上下左右距离10。
这句代码用汉语翻译过来的意思就是:
view1的约束添加 边缘相对于(他的父视图superview)来说执行添加(左右上下10的距离);
MASConstraintMaker 属性
Masonry | NSLayout | 翻译 |
---|---|---|
left | NSLayoutAttributeLeft | 左侧 |
top | NSLayoutAttributeTop | 上侧 |
right | NSLayoutAttributeRight | 右侧 |
bottom | NSLayoutAttributeBottom | 下侧 |
leading | NSLayoutAttributeLeading | 首部 |
trailing | NSLayoutAttributeTrailing | 尾部 |
width | NSLayoutAttributeWidth | 宽度 |
height | NSLayoutAttributeHeight | 高度 |
centerX | NSLayoutAttributeCenterX | 横向中心点 |
centerY | NSLayoutAttributeCenterY | 竖向中心点 |
baseline | NSLayoutAttributeBaseline | 文本基线 |
我们还看上面的例子来继续分析属性与参数
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
make.top.equalTo(superview.mas_top).with.offset(padding.top);
equalTo():约束针对于(),参数可以是NSNumber,可以是UIEdgeInsets,可以是父视图,甚至可以填写superview.mas_left。