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详解

最新文章

  1. java复杂枚举
  2. Microsoft.VisualStudio.TestTools.UnitTesting 命名空间
  3. 把本地仓库工程上传到github上和从gitbu同步工程到本地
  4. gtp转换mbr
  5. mkdir:批量创建文件夹
  6. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
  7. [翻译]你真的知道你看到的UTF-8字符是什么吗?
  8. netty 粘包问题处理
  9. HDU4289 Control 最大流
  10. VISUAL STUDIO 2005连接MYSQL数据库
  11. monkeyrunner环境搭建
  12. App Extensions篇之Share Extension
  13. Windows 下安装RabbitMQ服务器及基本配置
  14. matlab数据导入verilog仿真
  15. JAVA消息服务JMS规范及原理详解
  16. GIAC2018全球互联网架构大会深圳站盛况回顾,定格精彩瞬间!
  17. DX9 顶点缓存案例
  18. 解决连锁零售行业IT运维管理四大困境
  19. 2015 -> 2016
  20. Oracle归档与非归档模式

热门文章

  1. 前端模拟API数据的两种方式
  2. BZOJ1924_所驼门王的宝藏_KEY
  3. 北京Uber优步司机奖励政策(2月19日)
  4. LeetCode: 31. Next Permutation (Medium)
  5. clr via c#读书笔记四:call、callvirt
  6. SpringBoot-07:SpringBoot整合PageHelper做多条件分页查询
  7. 「日常训练」Kefa and Company(Codeforces Round #321 Div. 2 B)
  8. Django自定义管理表单
  9. Linux命令应用大词典-第10章 Shell相关命令
  10. <cfloat> (float.h)