第三方框架-纯代码布局:Masonry的简单使用

Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,采用链式编程的方式提供给开发者API。系统AutoLayout支持的操作,Masonry都支持,相比系统API功能来说,Masonry是有过之而无不及。

Masonry采取了链式编程的方式,代码理解起来非常清晰易懂,而且写完之后代码量看起来非常少。之前用NSLayoutConstraint写很多代码才能实现的布局,用Masonry最少一行代码就可以搞定。下面看到Masonry的代码就会发现,太简单易懂了。

Masonry基础API

mas_makeConstraints()  添加约束 

mas_remakeConstraints()  移除之前的约束,重新添加新的约束 

mas_updateConstraints()  更新约束,写哪条更新哪条,其他约束不变 

equalTo()  参数是对象类型,一般是视图对象或者mas_width这样的坐标系对象 

mas_equalTo()  和上面功能相同,参数可以传递基础数据类型对象,可以理解为比上面的API更强大 

width()  用来表示宽度,例如代表view的宽度 

mas_width()  用来获取宽度的值。和上面的区别在于,一个代表某个坐标系对象,一个用来获取坐标系对象的值

view的requiresConstraintBasedLayout方法--如果你在- (void)updateConstraints这个方法里面给自定义的控件更新控件的constraint,那么需要重写+ (BOOL)requiresConstraintBasedLayout方法,并且返回YES.否则的话,就不会显示该控件。如果直接在init方法中设置自定义控件的constraint,那么则不需要重写+ (BOOL)requiresConstraintBasedLayout方法,也可以显示。

更新约束和布局

- (void)setNeedsUpdateConstraints  标记需要进行重新布局
- (void)updateConstraintsIfNeeded  调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用updateConstraints方法
- (void)updateConstraints  重写此方法,内部实现自定义布局过程
- (BOOL)needsUpdateConstraints  当前是否需要重新布局,内部会判断当前有没有被标记的约束
关于UIView重新布局相关的API,主要用以下三个API:
- (void)setNeedsLayout  标记为需要重新布局
- (void)layoutIfNeeded  查看当前视图是否被标记需要重新布局,有则在内部调用layoutSubviews方法进行重新布局 
- (void)layoutSubviews  重写当前方法,在内部完成重新布局操作

Masonry常用方法

设置内边距

[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.left.equalTo(self.view).with.offset(10); 

make.top.equalTo(self.view).with.offset(10); 

make.right.equalTo(self.view).with.offset(-10); 

make.bottom.equalTo(self.view).with.offset(-10); 

}];

[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10)); 

}];

更新约束

[self.greenView mas_updateConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(100, 100)); }];

大于等于和小于等于某个值的约束

[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); // 设置宽度小于等于200 

make.width.lessThanOrEqualTo(@200); // 设置高度大于等于10 

make.height.greaterThanOrEqualTo(@(10)); }];

使用基础数据类型当做参数

/** 如果想使用基础数据类型当做参数,Masonry为我们提供了"mas_xx"格式的宏定义。 这些宏定义会将传入的基础数据类型转换为NSNumber类型,这个过程叫做封箱(Auto Boxing)。 "mas_xx"开头的宏定义,内部都是通过MASBoxValue()函数实现的。 这样的宏定义主要有四个,分别是mas_equalTo()、mas_offset()和大于等于、小于等于四个。 */ 

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); 

make.width.mas_equalTo(100); 

make.height.mas_equalTo(100); }];

设置约束优先级

/** Masonry为我们提供了三个默认的方法,priorityLow()、priorityMedium()、priorityHigh(),这三个方法内部对应着不同的默认优先级。 除了这三个方法,我们也可以自己设置优先级的值,可以通过priority()方法来设置。 */ 

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); 

make.width.equalTo(self.view).priorityLow(); 

make.width.mas_equalTo(20).priorityHigh(); 

make.height.equalTo(self.view).priority(200); 

make.height.mas_equalTo(100).priority(1000); }];

设置约束比例

// 设置当前约束值乘以多少,例如这个例子是redView的宽度是self.view宽度的0.2倍。 

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) { 

make.center.equalTo(self.view); 

make.height.mas_equalTo(30); 

make.width.equalTo(self.view).multipliedBy(0.2); }]

参考文章:

iOS自动布局框架-Masonry详解

猜你喜欢

转载自www.cnblogs.com/CoderAlex/p/9723032.html