在ios开发中用xib的方式,其中约束的功能非常强大,但在纯代码开发中添加约束就不就那么方便了,Masonry的出现改变了这一现象。html
先看一段代码:ios
UIView *view = [UIView new]; [view setBackgroundColor:[UIColor redColor]]; [self.view addSubview:view]; [view mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10)); //make.left.equalTo(self.view).with.offset(10); //make.right.equalTo(self.view).with.offset(-10); //make.top.equalTo(self.view).with.offset(10); //make.bottom.equalTo(self.view).with.offset(-10); }];
其中mas_makeConstraints就是添加约束。其中代码意思是上下左右距边界10。注释掉的代码同义。是否是很方便。git
Masonry配置github
- 推荐使用pods方式引入类库,pod 'Masonry'。ide
- 引入头文件 #import "Masonry.h"。spa
- Masonry的github地址:https://github.com/SnapKit/Masonrycode
Masonry使用讲解orm
再看上方的代码,注释掉的代码用中文来讲就是view的左边与父类相比较移动10.其余三个方向同义。(我的理解)htm
注意点1: 使用 mas_makeConstraints方法的元素必须事先添加到父元素的中,例如[self.view addSubview:view];对象
注意点2: masequalTo 和 equalTo 区别:masequalTo 比equalTo多了类型转换操做,通常来讲,大多数时候两个方法都是 通用的,可是对于数值元素使用mas_equalTo。对于对象或是多个属性的处理,使用equalTo。特别是多个属性时,必须使用equalTo,例如 make.left.and.right.equalTo(self.view);
注意点3: 注意到方法with和and,这连个方法其实没有作任何操做,方法只是返回对象自己,这这个方法的左右彻底是为了方法写的时候的可读性 。make.left.and.right.equalTo(self.view);和make.left.right.equalTo(self.view);是彻底同样的,可是明显的加了and方法的语句可读性 更好点。
@implementation view - (id)init { self = [super init]; if (!self) return nil; flg = YES; self.backgroundColor = [UIColor redColor]; bgview = [UIView new]; bgview.backgroundColor = [UIColor yellowColor]; [self addSubview:bgview]; [bgview makeConstraints:^(MASConstraintMaker *make) { make.width.equalTo(self.width).offset(-20); make.height.equalTo(self.height).offset(-20); make.left.equalTo(self.left).offset(10); make.top.equalTo(self.top).offset(10); make.bottom.equalTo(self.bottom).offset(-10); make.right.equalTo(self.right).offset(-10); }]; btn = [UIButton new]; [btn setBackgroundColor:[UIColor blueColor]]; [btn setTitle:@"按钮" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(btn_ction:) forControlEvents:UIControlEventTouchUpInside]; [bgview addSubview:btn]; lab = [UILabel new]; [lab setBackgroundColor:[UIColor greenColor]]; [bgview addSubview:lab]; [lab makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(btn.bottom).offset(50); make.left.equalTo(bgview.left).offset(15); make.width.equalTo(200); make.height.equalTo(40); }]; return self; } - (void)btn_ction:(id)sender{ flg = !flg; [self setNeedsUpdateConstraints]; [self updateConstraintsIfNeeded]; } -(void)updateConstraints{ if (flg) { [btn makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(bgview.left).offset(15); make.top.equalTo(bgview.top).offset(40); make.width.equalTo(100); make.height.equalTo(30); }]; }else{ [btn remakeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(bgview.left).offset(15); make.top.equalTo(bgview.top).offset(60); make.width.equalTo(200); make.height.equalTo(30); }]; } [super updateConstraints]; } @end
上面是我本身试着写的代码,bgview边界缩了一点,在bgview上加上了一个button,还有一个lable(lable的约束是相对button来算的)
给button添加了点击事件,改变约束。在这里,改变约束要写在-(void)updateConstraints这个方法里,谨记。仔细看代码,执行了
[self setNeedsUpdateConstraints]; [self updateConstraintsIfNeeded];
这俩,系统就会执行-(void)updateConstraints了。
差点忘了一点,
//1. 对于约束参数能够省去"mas_" #define MAS_SHORTHAND
//2. 对于默认的约束参数自动装箱 #define MAS_SHORTHAND_GLOBALS
必须在引入头文件 #import "Masonry.h"以前。(我代码里就没有mas_)
我讲的很简单,网上有许多牛人的博客能够搜索。