在ios开发中用xib的方式,其中约束的功能很是强大,但在纯代码开发中添加约束就不就那么方便了,Masonry的出现改变了这一现象。
先看一段代码:
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。注释掉的代码同义。是不是很方便。
Masonry配置
- 推荐使用pods方式引入类库,pod 'Masonry'。
- 引入头文件 #import "Masonry.h"。
- Masonry的github地址:https://github.com/SnapKit/Masonry
Masonry使用讲解
再看上方的代码,注释掉的代码用中文来说就是view的左边与父类相比较移动10.其他三个方向同义。(个人理解)
注意点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_)
我讲的很简单,网上有许多牛人的博客可以搜索。
推荐俩:http://www.cocoachina.com/ios/20150702/12217.html
https://www.cnblogs.com/wqcoder/p/5511676.html