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

在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

 

转载于:https://my.oschina.net/u/989459/blog/3007137

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值