现在iPhone手机屏幕越来越多, 屏幕适配也越来越重要. Masonry就是为屏幕适配而生的三方框架.

Masonry基础API

mas_makeConstraints()    添加约束
mas_remakeConstraints()  移除之前的约束,重新添加新的约束
mas_updateConstraints()  更新约束,写哪条更新哪条,其他约束不变equalTo()       参数是对象类型,一般是视图对象或者mas_width这样的坐标系对象
mas_equalTo()   和上面功能相同,参数可以传递基础数据类型对象,可以理解为比上面的API更强大width()         用来表示宽度,例如代表view的宽度
mas_width()     用来获取宽度的值。和上面的区别在于,一个代表某个坐标系对象,一个用来获取坐标系对象的值

更新约束和布局

- (void)updateConstraintsIfNeeded  调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用updateConstraints方法
- (void)updateConstraints          重写此方法,内部实现自定义布局过程
- (BOOL)needsUpdateConstraints     当前是否需要重新布局,内部会判断当前有没有被标记的约束
- (void)setNeedsUpdateConstraints  标记需要进行重新布局

Masonry示例代码

Masonry本质上就是对系统AutoLayout进行的封装,包括里面很多的API,都是对系统API进行了一次二次包装。
typedef NS_OPTIONS(NSInteger, MASAttribute) {MASAttributeLeft = 1 << NSLayoutAttributeLeft,MASAttributeRight = 1 << NSLayoutAttributeRight,MASAttributeTop = 1 << NSLayoutAttributeTop,MASAttributeBottom = 1 << NSLayoutAttributeBottom,MASAttributeLeading = 1 << NSLayoutAttributeLeading,MASAttributeTrailing = 1 << NSLayoutAttributeTrailing,MASAttributeWidth = 1 << NSLayoutAttributeWidth,MASAttributeHeight = 1 << NSLayoutAttributeHeight,MASAttributeCenterX = 1 << NSLayoutAttributeCenterX,MASAttributeCenterY = 1 << NSLayoutAttributeCenterY,MASAttributeBaseline = 1 << NSLayoutAttributeBaseline,
};

常用方法

设置内边距

/** 设置yellow视图和self.view等大,并且有10的内边距。注意根据UIView的坐标系,下面right和bottom进行了取反。所以不能写成下面这样,否则right、bottom这两个方向会出现问题。make.edges.equalTo(self.view).with.offset(10);除了下面例子中的offset()方法,还有针对不同坐标系的centerOffset()、sizeOffset()、valueOffset()之类的方法。*/
[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);
}];

通过insets简化设置内边距的方式

// 下面的方法和上面例子等价,区别在于使用insets()方法。
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {// 下、右不需要写负号,insets方法中已经为我们做了取反的操作了。make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];

更新约束

// 设置greenView的center和size,这样就可以达到简单进行约束的目的
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {make.center.equalTo(self.view);// 这里通过mas_equalTo给size设置了基础数据类型的参数,参数为CGSize的结构体make.size.mas_equalTo(CGSizeMake(300, 300));
}];// 为了更清楚的看出约束变化的效果,在显示两秒后更新约束。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 指定更新size,其他约束不变。[self.greenView mas_updateConstraints:^(MASConstraintMaker *make) {make.size.mas_equalTo(CGSizeMake(100, 100));}];
});

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

[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) {make.center.equalTo(self.view);// 设置宽度小于等于200make.width.lessThanOrEqualTo(@200);// 设置高度大于等于10make.height.greaterThanOrEqualTo(@(10));
}];self.textLabel.text = @"这是测试的字符串。能看到1、2、3个步骤,第一步当然是上传照片了,要上传正面近照哦。上传后,网站会自动识别你的面部,如果觉得识别的不准,你还可以手动修改一下。左边可以看到16项修改参数,最上面是整体修改,你也可以根据自己的意愿单独修改某项,将鼠标放到选项上面,右边的预览图会显示相应的位置。";

textLabel只需要设置一个属性即可

self.textLabel.numberOfLines = 0;

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

/** 如果想使用基础数据类型当做参数,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);
}];
Masonry也帮我们定义好了一些默认的优先级常量,分别对应着不同的数值,优先级最大数值是1000。
static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;

设置约束比例

// 设置当前约束值乘以多少,例如这个例子是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);
}];

小练习

子视图等高/等宽练习

     /**下面的例子是通过给equalTo()方法传入一个数组,设置数组中子视图及当前make对应的视图之间等高。需要注意的是,下面block中设置边距的时候,应该用insets来设置,而不是用offset。因为用offset设置right和bottom的边距时,这两个值应该是负数,所以如果通过offset来统一设置值会有问题。*/CGFloat padding = 10;UIView *redView = [[UIView alloc]init];redView.backgroundColor = [UIColor redColor];[self.view addSubview:redView];UIView *blueView = [[UIView alloc]init];blueView.backgroundColor = [UIColor blueColor];[self.view addSubview:blueView];UIView *yellowView = [[UIView alloc]init];yellowView.backgroundColor = [UIColor yellowColor];[self.view addSubview:yellowView];/**********  等高   ***********/[redView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.right.top.equalTo(self.view).insets(UIEdgeInsetsMake(padding, padding, 0, padding));make.bottom.equalTo(blueView.mas_top).offset(-padding);}];[blueView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.right.equalTo(self.view).insets(UIEdgeInsetsMake(0, padding, 0, padding));make.bottom.equalTo(yellowView.mas_top).offset(-padding);}];/**下面设置make.height的数组是关键,通过这个数组可以设置这三个视图高度相等。其他例如宽度之类的,也是类似的方式。*/[yellowView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.right.bottom.equalTo(self.view).insets(UIEdgeInsetsMake(0, padding, padding, padding));make.height.equalTo(@[blueView, redView]);}];/**********  等宽   ***********/[redView mas_makeConstraints:^(MASConstraintMaker *make) {make.top.left.bottom.equalTo(self.view).insets(UIEdgeInsetsMake(padding, padding, padding, 0));make.right.equalTo(blueView.mas_left).offset(-padding);}];[blueView mas_makeConstraints:^(MASConstraintMaker *make) {make.top.bottom.equalTo(self.view).insets(UIEdgeInsetsMake(padding, 0, padding, 0));make.right.equalTo(yellowView.mas_left).offset(-padding);}];[yellowView mas_makeConstraints:^(MASConstraintMaker *make) {make.top.bottom.right.equalTo(self.view).insets(UIEdgeInsetsMake(padding, 0, padding, padding));make.width.equalTo(@[redView, blueView]);}];

等高

等宽

子视图垂直居中练习

    CGFloat padding = 10;UIView *redView = [[UIView alloc]init];redView.backgroundColor = [UIColor redColor];[self.view addSubview:redView];UIView *blueView = [[UIView alloc]init];blueView.backgroundColor = [UIColor blueColor];[self.view addSubview:blueView];[redView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerY.equalTo(self.view);make.left.equalTo(self.view).mas_offset(padding);make.right.equalTo(blueView.mas_left).mas_offset(-padding);//make.width.equalTo(blueView);make.height.mas_equalTo(150);}];[blueView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerY.equalTo(self.view);make.right.equalTo(self.view).mas_offset(-padding);make.width.equalTo(redView);make.height.mas_equalTo(150);}];

子视图垂直居中练习

作者:浅宇落
链接:https://www.jianshu.com/p/587efafdd2b3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

iOS 布局 Masonry详解相关推荐

  1. iOS第三方插件——Masonry详解

    Masonry详解 https://www.jianshu.com/p/587efafdd2b3

  2. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  3. ExtJS 4.2 教程-08:布局系统详解

    ExtJS 4.2 系列教程导航目录: ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 教程-02:bootstrap.js 工作方式 ExtJS 4.2 教程-03:使用 ...

  4. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  5. CSS3 Flex 弹性布局用法详解

    什么是Flex弹性布局 Flex是Flexible Box的简称,意为弹性布局,顾名思义,在网页布局时,他可以给我们提供更多的灵活性. 说明: 1.flex是display的一个属性值.与之相当应的还 ...

  6. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  7. element布局容器大小_element中el-container容器与div布局区分详解

    用于布局的容器组件,方便快速搭建页面的基本结构: el-container:外层容器.当子元素中包含 或 时,全部子元素会垂直上下排列,否则会水平左右排列. el-header:顶栏容器. el-as ...

  8. 弹性盒子(flexbox)布局属性详解

    弹性盒子布局属性详解 1 弹性盒子概述 2 基本概念 3 常用属性 3.1 布局方向flex-direction 3.2 环绕效果flex-wrap 3.3 水平对齐方式justify-content ...

  9. iOS Masonry详解mas_makeConstraints() 添加约束 mas_remakeConstraints() 移除之前的约束,重新添加新的约束 mas_updateConst

    现在iPhone手机屏幕越来越多, 屏幕适配也越来越重要. Masonry就是为屏幕适配而生的三方框架. Masonry基础API mas_makeConstraints() 添加约束 mas_rem ...

最新文章

  1. Intellij-Idea使用小细节
  2. ArcGIS.Server.9.2.DotNet自带例子分析(一、二)
  3. mysql5.6 pt-query-digest,分析pt-query-digest输出信息
  4. 浅析数据库case when 用法
  5. 高级 Linux 命令精通指南(2)
  6. 有线电视的现状与发展,全国一网与广电5G一体化建设
  7. 7-27 通讯录的录入与显示 (10 分)
  8. OpenShift 4 - Fedora CoreOS (2) - 准备 Fedora CoreOS 安装环境的三个工具
  9. 牛客网-《剑指offer》-变态跳台阶
  10. Windows Server 2012 R2 VDI系列(八)—发布RemoteDesktop
  11. 在 Arch Linux 玩百度 Flash 战曲游戏乱码
  12. 检测PYthon标识符合法性脚本
  13. javaSocket编程UDP
  14. 阿里 计算机底层架构原理 pdf,完美起航-震撼!8位阿里大牛编写的2500页计算机底层架构原理解析,香香香...
  15. 流程管理思想与方法论(流程的永恒之道——笔记一)
  16. 联想g510拆键盘的简单方法_宏基4552g拆键盘怎么操作
  17. html5 innerhtml标签,innerHTML、outerHTML与innerText、outerText
  18. 被逼无奈,沉默寡言的程序员也开始露脸拍视频了
  19. 【时间纷飞】死人,死人
  20. 窥见数字未来“天机”,IBM正式发布2019十大行业洞察

热门文章

  1. vuex本地储存方案
  2. python基础读后感_Python基础教程【读书笔记】 - 2016/6/26
  3. MySQL批量删除所有重复数据只保留一条
  4. Java JDBC https://www.bilibili.com/video/BV1PE411i7CV?p=31spm_id_from=pageDriver
  5. oracle oem 13c新特性,【EMCC】Oracle 13c OEM 安装测试(13.2.0.0)
  6. c语言outl函数,在作业中Outlook
  7. 游戏建模一般使用什么软件?
  8. 使用下拉列表框进行多选
  9. wsappx把电脑卡爆了解决办法
  10. 利用html开发英语单词小程,前端利用表单标签自己制作一个简单的表单页面-表单制作-小程序表单制作...