iOS开发 ☞ Masonary适配详解

习惯使用AutoLayout进行适配的人可能上手Masonary会非常迅速,下面简要的讲述一下Masonary适配的思路

下面的代码是一个自定义View,并且对自定义View中的自控件进行布局。

- (void)layoutSubviews {
   [self addSubview:self.headerView];
   [self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
       make.left.equalTo(@0);
       make.top.equalTo(@0);
       make.right.equalTo(@0);
       make.height.equalTo(@50);
   }];
    [self.headerView addSubview:self.headerImgV];
    [self.headerView addSubview:self.headerLb];
    [self.headerImgV mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(@5);
        make.top.equalTo(@5);
        make.width.equalTo(@40);
        make.height.equalTo(@40);
    }];

    [self.headerLb mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.headerImgV.mas_right).offset(15);
        make.top.equalTo(@0);
        make.right.equalTo(@0);
        make.height.equalTo(@40);
    }];

    [self addSubview:self.remindInfoLb];
    [self.remindInfoLb mas_makeConstraints:^(MASConstraintMaker *make) {

            make.left.equalTo(@0);
            make.right.equalTo(@0);
            make.height.equalTo(@20);
            make.top.equalTo(self.headerView.mas_bottom).offset(0);
      }]; 
     [self addSubview:self.closeBtn];
     [self.closeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.equalTo(self);
            make.width.equalTo(@40);
            make.height.equalTo(@20);
            make.bottom.equalTo(@-10);
      }];
    }
}

这里只是附上了部分代码,思路如下:
1、在layoutSubviews这个方法里面进行布局(不解释)。

2、观察代码可以发现,在对子控件进行布局时,都是先表明了关系(哪个是父视图,哪个是子视图),再进行布局的。这样有一点好处就是,我们再做子控件相对于父控件布局的时候无需再指定是相对于哪个视图进行布局,也就简化了代码。

3、布局的关键在于分清哪些是子控件,哪个是父控件,以上面第一个代码段为例,通过视图的添加关系很容易看出视图的父子关系,而下面的适配代码默认就是相对于父视图布局的,也就是说self.headerView 左和上 的间距就是相对于self的布局。

二、用法
给view添加约束

[view mas_makeConstraints:^(MASConstraintMaker *make) { }];

将view的所有约束删除,重新添加新约束

[view mas_remakeConstraints:^(MASConstraintMaker *make) { }];

覆盖view的某些约束

[view mas_updateConstraints:^(MASConstraintMaker *make) { }

Masonry中使用and 和 with 增强可读性

包装:make.width.mas_equalTo(10); //省去将10 包装为NSNumber的过程。(make.width.equalTo(@10))
如果感觉不出来好处,那么看下面:

make.size.equalTo([NSValue valueWithCGSize:CGSizeMake(100, 100)]); make.size.mas_equalTo(CGSizeMake(100, 100));

简化:

make.right.equalTo(superView).offset(-20)//等于下面
make.right.offset(-20)//默认就是父控件
make.size.multipliedBy(.5);
make.width.height.mas_equalTo(100);//设置多参数
make.left.top.mas_equalTo(100);
make.edges.mas_equalTo(superView)
.insets(UIEdgeInsetMake(x,x,x,x)) //设置内边距

宏的使用:
在Masonry.h 前添加宏 MAS_SHORTHAND 可以避免在约束时写mas_

三、常见Bug
下面的断言说的是布局的空间没有添加到父视图中

*** Assertion failure in -[MASViewConstraint install]

解决方案:当我们在布局一个子控件时,如果用到其他子控件表明位置或者尺寸关系,我们应当确保在布局这个子控件之前已将需要用到的控件都添加到父视图上。

你可能感兴趣的:(布局,适配,masonary)