一.Masonry是什么:
答:是一个很好的三方,用来做适配的
Masonry是ios中用代码实现自动布局的一个框架,使用起来特别方便,主要有mas_makeConstraints(添加约束),mas_updateConstraints(更新约束),mas_remakeConstraints(移除约束要谨慎,防止view的fram缺东西)3个方法。
二.怎么使用Masonry
1.导入框架:a.直接拷贝过去 b.用cocospod:pod 'Masonry', '~> 1.0.1'
2.导入头文件
#define MAS_SHORTHAND
#define MAS_SHORTHAND_GLOBALS//加上这两个宏就不需要考虑父控件了
#import "Masonry.h"
使用技巧:引入下面2个宏,就不需要加mas_前缀了。
//define this constant if you want touse Masonrywithout the'mas_' prefix
#define MAS_SHORTHAND
//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS
Shorthand(12月7日新增)
在写代码的时候,可能你会感觉有的东西要加mas_前缀,有的东西又不用加,代码风格不统一,而且加mas_前缀还麻烦。
前面介绍过加mas_前缀主要是在扩展系统类的时候为了避免与原有类冲突,这是Apple推荐的做法。不过目前来说,即使不加mas_前缀,也不会有什么问题。所以Masonry提供了不加mas_前缀的方法,只需要你定义几个宏即可。
MAS_SHORTHAND
定义MAS_SHORTHAND宏之后。可以使用UIView,NSArray中不带mas_前缀的makeConstraints,updateConstraints,remakeConstraints。以及UIView中不带mas_前缀的Attribute。
MAS_SHORTHAND_GLOBALS
默认的equalTo方法只接受id类型的对象。有时候我们想传入一个CGFloat, CGSize, UIEdgeInsets等。还需要将其转化成NSValue对象,比较麻烦。Masonry也考虑到了这种情况。只需要定义MAS_SHORTHAND_GLOBALS宏。就可以直接对equalTo传入基础类型。Masonry自动转化成NSValue对象
3.添加约束
[confirmPayment mas_makeConstraints:^(MASConstraintMaker *make) {
}];
三.举例说明
1.基本使用(一个控件的布局)
__weak typeof (self) weakSelf = self;//防止循环使用
[confirmPayment mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.view).with.offset(10);//距离上面10px
make.left.equalTo(weakSelf.view).with.offset(10);//距离左边10px
make.bottom.equalTo(weakSelf.view).with.offset(-10);//距离下边10px
make.right.equalTo(weakSelf.view).with.offset(-10); //距离右边10px
make.center.equalTo(weakSelf.view);//位于该父视图的中心
make.size.mas_equalTo(CGSizeMake(150, 60));//设置这个控件的大小
make.edges.mas_offset(UIEdgeInsetsMake(100, 10, 100, 10));//距离上左下右各为10px
}];
当导入宏
#define MAS_SHORTHAND
#define MAS_SHORTHAND_GLOBALS//加上这两个宏就不需要考虑父控件了
make.top.equalTo(weakSelf.view).with.offset(10);//距离上面10px
等同于
make.top.equalTo(10)//距离上面10px
2.多个控件(兄弟控件的布局)
UIView *view2 = [[UILabel alloc]init];
view2.backgroundColor = [UIColor yellowColor];
[self.view addSubview:view2];
[view2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(100, 100));
make.centerX.equalTo(view1);//view2跟view1的中心X对齐
make.top.equalTo(view1.mas_bottom).with.offset(20);//view2距离view1的下面10px
}];
3 让一个蓝色view的内边距为50,点击屏幕后内边距变为100,具体实现如下(2中写法):
[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
第一种写法
make.left.top.equalTo(self.view).offset(20);
make.bottom.right.equalTo(self.view).offset(-20);
第二种写法
make.edges.insets(UIEdgeInsetsMake(50, 50, 50, 50));
}];
点击屏幕后更新约束代码如下:
[blueView mas_updateConstraints:^(MASConstraintMaker *make) {
第一种写法
make.top.left.equalTo(self.view).offset(100);
make.bottom.right.equalTo(self.view).offset(-100);
第二种写法
make.edges.insets(UIEdgeInsetsMake(100, 100, 100, 100));
}];
4 蓝色view距离顶端100,距离左右各20,高度50,黑色view和蓝色view右端对其,黑色view顶端距离蓝色view底端20,并且宽度是蓝色view的一半,截图和代码如下(相对于父控件的约束可以省略):
[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.offset(100);
make.left.offset(20);
make.right.offset(-20);
make.height.offset(50);
}];
[blankView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(blueView);
make.height.equalTo(blueView);
make.top.equalTo(blueView.mas_bottom).offset(10);
make.width.equalTo(blueView).multipliedBy(0.5);
}];