Masonry作为目前较为流行的自动布局第三方框架,简单易用,大大减少了程序员花在UI布局和屏幕适配的精力与时间。

1 基本用法

1.1 事例1:

图1-1

// 首先是view1自动布局

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {

// view1左边与superView左边对齐

make.left.equalTo(superView.mas_left);

// view1右边与superView右边对齐.

make.right.equalTo(superView.mas_right);

/* 这两句代码约束了view1的左边与右边,等价于约束了view1的宽

度,宽度与superView的宽度相等,superView宽度变了,view1宽度也

更着改变*/

// viewe1上边于superView上边对齐

make.top.equalTo(superView.mas_top);

// view1高度固定为44,等于一个数时用mas_equalTo();

make.height.mas_equalTo(44);

/* 到这里view1布局完成,它的origin(位置:x,y)和size(尺寸:

width,height)都确定了,实际上就是view1的frame确定了。*/

}];

/* 任意一个UIView的布局都需要确定位置和尺寸:x和y, width和

height,缺一不可。下面是view2的布局 */

[view2 mas_makeConstraints:^(MASConstraintMaker *make) {

// view2左边与view1左边对齐,即x确定,也可以与superView对齐

make.left.equalTo(view1.mas_left);

// view1宽度固定为90,即width确定。

make.width.mas_equalTo(90);

// 这里view2的高度与view1的高度相等,即height确定.

make.height.equalTo(view1.mas_height);

// 底边与superView底边对齐,结合高度约束,y确定。

make.bottom.equalTo(superView.mas_bottom);

}];

/* x,y既可以通过left,top直接确定,也可以通right结合width,bottom

结合height间接确定 ,width和height通过mas_equalTo()直接确定以及

通过equalTo(view)依赖view的宽高间接确定 */

1.2 事例2:

图1-2

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {

// 与superView左边对齐,x确定。

make.left.equalTo(superView.mas_left);

// 与superView上边对齐,y确定。

make.top.equalTo(superView.mas_top);

// view1宽度固定为90,width确定。

make.width.mas_equalTo(90);

// view1高度height未确定。

}];

//view2布局,假设双箭头( 间距 )为20;

[view2 mas_makeConstraints:^(MASConstraintMaker *make) {

/* view2的左边与superView左边+一个数对齐,从这里换个说法

,view2的左边等于superView的左边加上一个间距,x确定。*/

make.left.equalTo(superView.mas_left).offset(20)

// view2的底边等于superView底边。

make.bottom.equalTo(superView.mas_bottom);

// view2的尺寸等于view1的尺寸(高度和宽度),size(width,height)确定

make.size.equalTo(view1);

/* 上面一句等价于make.height.width.equalTo(view1); */

// view2的顶边等于view1的底边加上间距,结合高度约束,y确定。

make.top.equalTo(view1.mas_bottom).offset(20)

/* 四个要素确定,约束完成,view2的宽高度与view1的宽高度相同,

由于两者没有。固定高度,只有固定的间距,故view1和view2的高度

会随着superView的高度变化而变化。*/

}];

//啰嗦下坐标

图1-3

//view3布局,假设间距为20。

[view3 mas_makeConstraints:^(MASConstraintMaker *make) {

/* 从图中看出右边最好确定,右边等于superView的右边加上间距 */

make.right.equalTo(superView.mas_right).offset(-20);

// 坐标计算: 往左-20,往右+20。

// view3的顶边等于superView顶边加一个间距

make.top.equalTo(superView.mas_top).offset(20); //往上-20, 往下+20

// view3的底边等于superView的底边加上一个间距。

make.bottom.equalTo(superView.mas_bottom).offset(-20)

// 到这里view3的高度确定,但宽度和x,y都尚未确定

// view3宽度确定后结合right约束x跟着确定

make.width.mas_equalTo(90);

/* 剩下y未确定,从图中可以看出view3在superView中应该是垂

直方向上居中,可以直接设置centerY */

make.centerY.equalTo(superView.mas_centerY);

/* 无论superView高宽怎么变化,view3始终在垂直方向上居中,

且紧挨着superView右侧,高度会随着superView变化而变化,当

然,你也可以直接固定高度,顶边与底边就不用在设置了,这样,

superView高度变大变小,view3始终那么高,如何选择肯定是跟

UI界面需求有关 */

}];

/* 这部分主要介绍了基本用法, top, bottom, left, right, centerY(相应的有

centerX), equalTo(), mas_equalTo(), offset() */

2 注意事项

2.1 问题

(1)  view 进行布局了但没有效果

1)  view为空,相当于给空指针发送消息,没有作用。

2)  布局依赖的UIView(如superView,view2)没有布局好.(说明:

make.equalTo(view2),view2为依赖的UIView).

3)  view 本身没有显示什么东西

4)  view 没有添加到superView

5)  等等。。。。。。。

(2)  约束过多相悖或缺少

Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want.

(3)程序崩溃,一般是约束依赖的对象(如superView)为空

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempting to add unsupported attribute: (null)';

2.2 综合解决方法

设置view的背景以便观察,辅以View UI Hierarchy观测.

最直接有效的方法是在当前界面的第一个自动布局的view处打上断点,一行一行往下走( step over ),若直接跳过当前view布局,一般是当前view为空; 若进去在某一行程序崩溃,一般是当前约束语句依赖的对象为空。

2.3 细节( 自行忽略 )

规律:边界:view1与superView对齐,相邻:view2与view1的左边、右边、顶边或者底边对齐,中心:centerX,centerY对齐,一个整体内的view与该整体对齐.固定与变化的选择依UI需求.

一般情况下,布局是在layoutSubViews()或者控制器viewDidLayoutSubViews(),若不是,如:view1在布局约束前未执行[superView addSubViews:view1],程序也会崩溃。

有些view,如UILabel没有约束高度而设置了numerOfLines = 0时UILabel的高度会随着内容的多少而变化。

关于Masonry框架(AutoLayout)的用法--面向初学者的更多相关文章

  1. iOS学习——布局利器Masonry框架源码深度剖析

    iOS开发过程中很大一部分内容就是界面布局和跳转,iOS的布局方式也经历了 显式坐标定位方式 --> autoresizingMask --> iOS 6.0推出的自动布局(Auto La ...

  2. iOS:在tableView中通过Masonry使用autolayout在iOS7系统出现约束崩溃

    一.出现崩溃情景: 给tableView创建一个头视图,也即tableHeaderView,然后使用Masonry并切换到iOS7/7.1系统给tableHeaderView中的所有子视图添加约束,此 ...

  3. iOS开发之Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  4. Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  5. iOS开发之Masonry框架源码解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  6. 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)(1) - 目录

    昨天发表了<如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor>后,大家十分热情,几个小时内就收到了不少问题,包括: 对于ui自动化测试这方 ...

  7. scrapy框架中Spiders用法

    scrapy框架中Spiders用法 Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据 总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以 ...

  8. Masonry UIScrollView autolayout 的一个奇特的问题

    事情是这样的.... 我一个工程里 一直使用的 masonry 做autolayout,有个gesturerReconizer的bug,找了很久,发现很奇怪一个现象: 我的某个view 是这样的 |- ...

  9. 线程框架Executor的用法举例

    java5线程框架Executor的用法举例 Executor 是 java5 下的一个多任务并发执行框架(Doug Lea),可以建立一个类似数据库连接池的线程池来执行任务.这个框架主要由三个接口和 ...

随机推荐

  1. 上传GIF图片方法!

    有朋友问,如何上传GIF图片,在此做一下说明.方法是:在第二栏“上传图片”栏——选择“无水印”——选择文件(找到文件)——点击上传——点击插入——我选的图片 ——上传成功了!

  2. Winodws安装系统时,通过安装磁盘进行分区

    今天使用一个系统盘安装的时候,很奇怪,分区总是分出来一个系统磁盘,一个MBR,剩下的只能分主分区. 这样就导致我在进行windows激活时,激活工具都找不到启动磁盘的盘符(因为自动分出来的系统磁盘和M ...

  3. RecyclerView全面解析

    写在前面 起深入浅出这名字的时候我是慎重又慎重的,生怕被人骂标题党,写的什么破玩意还敢说深入浅出.所以还是请大家不要抱着太高的期望,因为没有期望就没有失望,就像陈润说的,超预期嘛.全当看小说的心情来看 ...

  4. linux系统基础(二)

    磁盘管理(一) Linux设备认识 /dev/cdrom /dev/sr0 /dev/mouse /dev/sda /dev/hda IDE硬盘(支持4块):hd(a-d) [非IDE硬盘]SCSI硬 ...

  5. hdu3589 Jacobi symbol(二次剩余 数论题)

    本题的注意点:n=p1*p2*p3......Pm 解法:直接利用公式a^((p-1)/2)=(a/p)mod p 即可求解. #include<stdio.h> #include< ...

  6. Dev 等待提示 WaitDialogForm 升级版

    本文转载:http://www.cnblogs.com/VincentLuo/archive/2011/12/24/2298916.html   一.Dev的等待提示框                 ...

  7. 在aws ec2上使用root用户登录

    aws ec2默认是使用ec2-user账号登陆的,对很多文件夹是没有权限的.如何使用root账号执行命令就是一个问题了.解决办法如下: 1.根据官网提供的方法登录连接到EC2服务器(官网推荐wind ...

  8. Java设计模式10:设计模式之 值对象

    1. 场景和问题: 在Java程序中,需要在对象之间交互大量的数据,比如要为方法传入参数,也要获取方法的返回值,请问如何能更好的进行数据的交互? 2. 解决方案:      值对象 3. 值对象的本质 ...

  9. AndroidStudio中安装可自动生成json实体类的jar包

    第一步:安装gsonjar包, 这样gson包就下载好了.接下来安装能自动生成实体类的插件: 接下来不要忘了重启: 重启后,就可以通过自定义的快捷键 alt+shift+s来打开generate,从而 ...

  10. compile ffmpeg

    download SDL 1.2.xxx version source code. 1) configure 2) make & make instll download recent ffm ...