Masonry需要注意的几个点
Masonry不常用到的方法
关于mas_key
Masonry中用来标记view的key值(a key to associate with this view),通过runtime在view中添加的属性。
mas_key最大的用处是用来在发生约束冲突时,清晰的标记出冲突的出处。例如:
在没有定义mas_key时,发生约束冲突,后台报的错误信息:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<MASLayoutConstraint:0x6000002a0480 UIView:0x7ffadf511da0.left == UIView:0x7ffadf5105e0.left>",
"<MASLayoutConstraint:0x6000002a0a80 UIView:0x7ffadf511da0.leading == UIView:0x7ffadf5105e0.leading - 10>"
)
Will attempt to recover by breaking constraint
<MASLayoutConstraint:0x6000002a0a80 UIView:0x7ffadf511da0.leading == UIView:0x7ffadf5105e0.leading - 10>
由于没有定义mas_key,错误信息打印的是对象的内存地址。代码阅读不友好。
当定义mas_key后,发生约束冲突,后台报的错误信息:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added unwanted constraint or constraints and fix it.
(
"<MASLayoutConstraint:0x6000000b7700 UIView:view.left == UIView:self.view.left>",
"<MASLayoutConstraint:0x6040000b7760 UIView:view.leading == UIView:self.view.leading - 10>"
)
Will attempt to recover by breaking constraint
<MASLayoutConstraint:0x6040000b7760 UIView:view.leading == UIView:self.view.leading - 10>
定义mas_key后,代码阅读是不是更加友好,而且冲突产生的原因和对象也一目了然了。
当多个view添加到父view时,每个都定义mas_key会很麻烦。Masonry为我们提供了能够快捷添加mas_key的宏定义:
MASAttachKeys(view, self.view); //批量设置mas_key
关于Relationship
typedef NS_ENUM(NSInteger, NSLayoutRelation) {
NSLayoutRelationLessThanOrEqual = -1,
NSLayoutRelationEqual = 0,
NSLayoutRelationGreaterThanOrEqual = 1,
};
对应约束中的三种关系分别为:<=, =, >=.
在masonry对应的三个方法分别为:
- (MASConstraint * (^)(id attr))lessThanOrEqualTo;
- (MASConstraint * (^)(id attr))equalTo;
- (MASConstraint * (^)(id attr))greaterThanOrEqualTo;
重点来解释下lessThanOrEqualTo和greaterThanOrEqualTo这2个方法。
有的时候label中显示的字数是不确定的,所以宽度不确定。而我们希望view随着label变化,就可以按下面这么写。意思是view左边大于等于label的左边位置
make.left.greaterThanOrEqualTo(label.mas_left);
同理,当label在view中时,由于字数不确定导致label宽度不确定。我们希望label的左边不超出父view的左边,可以按下面这么写
make.left.lessThanOrEqualTo(label.mas_left);