Masonry 用链式语句封装自动化布局,让布局的语句可以更简洁明了,可读性更高。
首先将布局语句封装在 block 中,然后再通过以下方法给视图添加约束
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;
可以给哪些属性添加约束?
可以给如图所示的属性添加约束,特别的是,MASConstraintMaker 还提供三个组合的属性:
- (MASConstraint *)edges {
return [self addConstraintWithAttributes:MASAttributeTop | MASAttributeLeft | MASAttributeRight | MASAttributeBottom];
}
- (MASConstraint *)size {
return [self addConstraintWithAttributes:MASAttributeWidth | MASAttributeHeight];
}
- (MASConstraint *)center {
return [self addConstraintWithAttributes:MASAttributeCenterX | MASAttributeCenterY];
}
分别将属性组合,方便我们给属性添加约束。
make、update、remake 区别
make
新增 block 中出现的约束
update
更新 block 中出现的约束,主要通过设定 constraintMaker 的 updateExisting 为真,会将之前给 view 添加的所有约束重新安装一遍
remark
会清除之前出现的所有约束,仅保留当前 block 中出现的约束,主要通过设定 constraintMaker 的 removeExisting 为真,会将之前给 view 添加的所有约束移除掉,安装新添的约束
在具体设定约束时,有这么几种方法设定约束
//类似于"="
- (MASConstraint * (^)(id attr))equalTo;
//类似于">="
- (MASConstraint * (^)(id attr))greaterThanOrEqualTo;
//类似于"<="
- (MASConstraint * (^)(id attr))lessThanOrEqualTo;
ContentHuggingPriority、ContentCompressionResistancePriority 区别
ContentHuggingPriority
表示视图抱紧的能力,在父视图变大时,子视图的这个属性优先级越高,越不容易被拉伸,越不会随着父级变大而被拉伸。
ContentCompressionResistancePriority
表示视图抗挤压的能力,在其父视图排列不下子视图时,子视图的这个属性优先级越高,越不容易被挤压,显示的内容越完整。
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
其中,UILayoutPriority 有这四个级别表示优先级:
UILayoutPriorityFittingSizeLevel、UILayoutPriorityDefaultLow、UILayoutPriorityDefaultHigh、UILayoutPriorityRequired 用 50、250、750、1000 这四个浮点数表示其优先级,设定时我们也可以通过直接给 priority 设置浮点数,来表示其优先级。
IntrinsicContentSize 是什么?
IntrinsicContentSize 表示视图的固有大小,当这个视图里面已经有一些东西,就会有 IntrinsicContentSize 这个固有大小。
比方说 UILabel 有 text、UIButton 有 textLabel 、UIImageView 有 image 等内部的东西,就会有固有大小,不用特意设置其大小也能显示出来。
而当 view 不含有任何子视图,并且未设定其大小时,就不会显示出来。
可以通过重写视图的 intrinsicContentSize 来提供默认的视图大小。