Masonry------轻量级的布局框架

Masonry是什么?

Masonry是一个轻量级的布局框架,拥有自身的描述性语法,采用更加优雅的链式语法封装了自动布局autolayout,简洁明了,可读性高,并且同时支持iOS和Mac OSXMasonry
Masonry在GitHub

Masonry怎么用?

首先我们看一下官方的示例代码:

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];

Masonry的一些属性与NSLayoutAttribute对照

MASViewAttribute NSAutoLayout 说明
view.mas_left NSLayoutAttributeLeft 左侧
view.mas_right NSLayoutAttributeRight 右侧
view.mas_top NSLayoutAttributeTop 上侧
view.mas_bottom NSLayoutAttributeBottom 下侧
view.mas_leading NSLayoutAttributeLeading 首部
view.mas_trailing NSLayoutAttributeTrailing 尾部
view.mas_width NSLayoutAttributeWidth
view.mas_height NSLayoutAttributeHeight
view.mas_centerX NSLayoutAttributeCenterX 横向中点
view.mas_centerY NSLayoutAttributeCenterY 纵向中点
view.mas_baseline NSLayoutAttributeBaseline 文本基线

举例:

1. 居中显示一个View:

    UIView *view1 = [[UIView alloc] init];
    view1.backgroundColor = [UIColor redColor];
    //2.使用Masonry约束之前,一定要将view加到superView上,否则会报错
    [self.view addSubview:view1];
    //用masonry函数对你添加的view进行约束
    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        // 设置view1居中
        make.center.equalTo(self.view);
        // 设置view2宽高
        make.size.mas_equalTo(CGSizeMake(300, 300));
    }];
    /**
     *1.mas_makeConstraints 只负责添加新增约束,Autolayout中不能同时存在两条针对于同一对象的约束,否则会报错
     *2.mas_makeConstraints 针对上面的情况,会更新在block中出现的约束,确保不会出现两个相同的约束
     *3.mas_makeConstraints 会清除之前所有的约束,仅保留最新的约束
     */
    /**
     *mas_equal 除了支持NSNumber的数值类型外,就支持CGPoint CGSize UIEdgeInsets
     */

2.让一个view略小于其superView[边界15];

    UIView *view2 = [[UIView alloc] init];
    view2.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:view2];
    [view2 mas_makeConstraints:^(MASConstraintMaker *make) {
        //1.第一种布局方法
        make.top.equalTo(self.view).with.offset(15);
        make.left.equalTo(self.view).with.offset(15);
        make.bottom.equalTo(self.view).with.offset(-15);
        make.right.equalTo(self.view).with.offset(-15);
        //2.第二种
//        make.top.left.bottom.and.right.equalTo(self.view).insets(UIEdgeInsetsMake(15, 15, 15, 15));
        //3.第三种
//        make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(15, 15, 15, 15));
    }];

3.让两个高度为150 的veiw垂直居中并且等宽等间隔排列 间隔(10) 宽度自动计算

    UIView *view3 = [[UIView alloc] init];
    view3.backgroundColor = [UIColor purpleColor];
    [self.view addSubview:view3];
    
    UIView *view4 = [[UIView alloc] init];
    view4.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:view4];
    [view3 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.view.mas_centerY);
        make.left.equalTo(self.view.mas_left).with.offset(10);
        make.right.equalTo(view4.mas_left).with.offset(-10);
        make.height.mas_equalTo(@150);
        make.width.equalTo(view4);
    }];
    [view4 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.view.mas_centerY);
        make.left.equalTo(view3.mas_right).with.offset(10);
        make.right.equalTo(self.view.mas_right).with.offset(-10);
        make.height.equalTo(view3);
        make.width.equalTo(view3);
    }];

使用Masonry过程中可能出现的错误:

一.错误信息统计(width改为with)

reason: 'Attributes should be chained before defining the constraint relation'
崩溃到masonry内部的方法里面:

Masonry------轻量级的布局框架_第1张图片

崩溃的提示信息:

Masonry------轻量级的布局框架_第2张图片

直接上代码:(这是运行没有问题的代码)

     [self.GradientLabel mas_makeConstraints:^(MASConstraintMaker *make) {
           make.right.equalTo(self.CurrenPriceLabel.mas_right);
          make.left.equalTo(self.VariationLabel.mas_left).**with**.offset(30);**//更改的是此处的width变为with,否则会报错**
          make.**width**.equalTo(@60);**//此处的width不需要改动**
          make.height.mas_equalTo(@30);
     }];

注意:解决方法将width更改为with即可。并不是全部的width都要改变,注意看上面的代码部分。

二.错误信息统计(父子控件之间的关系没有建立好)

reason:couldn't find a common superview for

Masonry------轻量级的布局框架_第3张图片
Masonry------轻量级的布局框架_第4张图片
Masonry------轻量级的布局框架_第5张图片

解决方法:查---好自己做约束的父子控件之间的关系是否建立起来了。

         UITextField *nameTextField = [UITextField new];
         nameTextField.font = [UIFont systemFontOfSize:14];
         nameTextField.placeholder = @"请再次输入密码";
***        //父子控件的建立好关系:self.testView为父控件,nameTextField为子控件***
         [self.testView **addSubview**:nameTextField];
         ***//开始约束***
        [lable mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.testView.mas_left).with.offset(20);
        make.top.mas_equalTo(self.testView.mas_top).with.mas_offset(0);
        make.height.mas_equalTo(30);
        make.width.mas_equalTo(50);
     }];

可能出现的错误章节摘于作者 Xcode8

你可能感兴趣的:(Masonry------轻量级的布局框架)