ios第三方框架Masonry----约束

在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_)

我讲的很简单,网上有许多牛人的博客能够搜索。

推荐俩:http://www.cocoachina.com/ios/20150702/12217.html

https://www.cnblogs.com/wqcoder/p/5511676.html

相关文章
相关标签/搜索