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);

 

 

posted @ 2017-11-03 16:22  Alex.xue  阅读(1595)  评论(0编辑  收藏  举报