Masonry 使用总结(示例)

来源:互联网 发布:网络主播面试什么条件 编辑:程序博客网 时间:2024/06/05 22:41

  • 尺寸
  • 边距
  • 相对位置
  • 居中
  • 其他用法
  • 更新约束
  • 重置约束
  • 设置优先级
  • UILabelUIImageView 约束的特殊性
  • equalTo 和 mas_equalTo的区别
  • 部分常见崩溃报错

尺寸

1、设置宽、高
make.width.mas_equalTo(120);
make.height.mas_equalTo(80);

2、同时设置宽高为某常量
make.width.height.mas_equalTo(100);

3、设置宽度是某个view的乘数
make.width.equalTo(sv1).multipliedBy(0.8);
make.width.equalTo(superView.mas_width).multipliedBy(0.2);

4、将size设置成(300,300)
make.size.mas_equalTo(CGSizeMake(300, 300));

4、控件的宽和高小于或者等于self.view的宽和高,因此这个控件的最多能放大到全屏幕。
make.width.height.lessThanOrEqualTo(self.view);

12、固定尺寸:
正确: make.size.mas_equalTo(CGSizeMake(22, 22));

错误:make.size.equalTo(CGSizeMake(22, 22));

14、让控件的宽和高相等且设置其优先级最低。

make.width.height.mas_equalTo(100 * self.scacle).priorityLow();


边距

6、当我们是要与父控件相对约束时,可以省略掉父视图。
简写 make.right.mas_equalTo(-padding);

完整写法为:
make.right.mas_equalTo(bludView.superView.mas_right).offset(-padding);

注意,并不是什么时候都可以省略,只有约束是同样的才可以省略。比如,约束都是right才可以。如果是一个left一个是right,那么就不能省略了。

7、与父控件有边距
make.edges.equalTo(superview).with.insets(padding);

10、让一个view略小于其superView(边距为10)

UIView *sv1 = [UIView new];[sv1 showPlaceHolder];sv1.backgroundColor = [UIColor redColor];[sv addSubview:sv1];[sv1 mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.equalTo(sv).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));

等价于

    make.top.equalTo(sv).with.offset(10);    make.left.equalTo(sv).with.offset(10);    make.bottom.equalTo(sv).with.offset(-10);    make.right.equalTo(sv).with.offset(-10);

也等价于

make.top.left.bottom.and.right.equalTo(sv).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));


相对位置

1、sv2 紧跟在 sv1下面
正确: make.top.equalTo(self.label0.mas_bottom);

错误:
make.top.equalTo(self.label0.bottom);
make.top.equalTo(self.label0.top);


居中

居中于父控件
make.center.equalTo(pView);


其他用法

1、顶部、高度和底部都与greenView的顶部、高度和底部相等
make.top.height.bottom.mas_equalTo(greenView);


更新约束

- (void)updateLayout{    //更新约束:覆盖原有的约束;可以设置多个    //更新redView的约束高度变为80    [self.redView mas_updateConstraints:^(MASConstraintMaker *make) {        make.height.mas_equalTo(80);        make.trailing.equalTo(self.view).with.offset(-30);    }];}

重置约束

- (void)remakeLayout{    //重新设置,会把之前的约束给清空掉,然后使用新的约束,必须设全四个约束    [self.redView mas_remakeConstraints:^(MASConstraintMaker *make) {        make.top.left.offset(20);        make.right.offset(-20);        make.height.mas_equalTo(80);    }];}

设置优先级


UILabel、UIImageView 约束的特殊性

总结:
1. UILabel、UIImageView 可以不设置宽高;
2. 不设置宽高时,根据文字、图片内容自动包裹;
3. 当文字内容、图片尺寸改变时,宽度自动改变;
4. 当label设置了对trailing的边距,同时左边有view与它有相对距离时;label变宽,这个view也会向左移动,不需要更新约束。

 [self.label mas_makeConstraints:^(MASConstraintMaker *make) {        make.trailing.equalTo(self.view);        make.top.equalTo(self.view).with.offset(30);    }];    self.label.text = @"123";

2、多行的UILabel不设置宽高时,preferredMaxLayoutWidth用来制定最大的宽;设置宽度后,preferredMaxLayoutWidth无效。
self.label.preferredMaxLayoutWidth = 250;


equalTo 和 mas_equalTo的区别

mas_equalTo是一个MACRO,后面接常量:CGPoint CGSize UIEdgeInsets,和NSNumber支持的那些数值类型

make.height.mas_equalTo(@150); make.width.equalTo(sv2);


部分常见崩溃报错

1、 self是控制器
make.trailing.equalTo(self);
这样的写法报错时,可能self是一个控制器,而不是view,改成下面写法试试:

make.trailing.equalTo(self.view);

2、参考view为空

make.trailing.equalTo(bgView);

bgView没有初始化,为nil的时候,会崩溃;


mas_makeConstraints 只负责新增约束 Autolayout;一个make方法不能同时存在两条针对于同一对象的约束,否则会报错。


参考文章
Starming星光社:AutoLayout框架Masonry使用心得

0 0