Masnory学习札记

  在之前的文章里有草草提到过Masonry自动布局,可这么重要第三方布局框架的怎么可以怎么随便带过呢!昨天在完成页面的时候刚好遇到了被Masorny功能惊叹的部分,所以趁热打铁写下了这篇札记,记录一下方便日后回忆。

一、概念

  Autolayout最重要的是约束:UI元素之间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。但约束冲突和约束不足都会造成布局无法确定,从而产生异常报错。

  Masonry是公认非常简洁优美的一款Autolayout框架,也是纯手写代码关于页面布局经历了MagicNumber -> autoresizingMask -> autolayout三个时期后的优秀产物。在Apple的Developer的官方文档中是这么描述Auto Layout的,“Auto Layout dynamically calculates the size and position of all the views in your view hierarchy, based on constraints placed on those views.”(自动布局根据视图上的约束动态计算视图层次结构中所有视图的大小和位置)。Masonry作为一个轻量级的布局框架 ,拥有自己的描述语法 ,采用更优雅的链式语法封装自动布局, 简洁明了 并具有高可读性, 而且同时支持 iOS 和 Max OS X。【此处要区别于jsp、html等其他环境下的Masonry,我将要描述的是在ios开发环境下的Masonry】。虽然在.storyboard的Interface Bulider Document面板上有Auto Layout的选项,但在实际项目中往往是团队合作此时控件拖拽的开发模式就被摒弃了,因为纯手写代码更容易规范化也易于团队协作,这样Masonry的好处就显露出来了。

二、使用

1.Masonry 支持的属性与NSLayoutAttrubute的对照表

2.基本使用

  • mas_makeConstraints:添加约束
  • mas_updateConstraints:更新约束、亦可添加新约束(需触发)
  • mas_remakeConstraints:重置之前的约束

  • multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比

  • priorityLow()设置约束优先级
  • #define MAS_SHORTHAND_GLOBALS 使用全局宏定义,可以使equalTo等效于mas_equalTo
  • #define MAS_SHORTHAND 使用全局宏定义, 可以在调用masonry方法的时候不使用mas_前缀

  --注意约束视图对象只有在被addSubview之后,才能给视图添加约束--

3.项目中的例子

  为了适应可以动态变化的页面,我给注册按钮增加了布局约束的更新操作。实现效果如下:

  

    //未展开情况下的注册按钮的masonry

      [self addSubview:_registerBtn];//添加约束对象
[_registerBtn mas_makeConstraints:^(MASConstraintMaker *make) {//添加约束
make.top.equalTo(_password.mas_bottom).offset( * kScaleH);
make.left.equalTo(self).offset();
make.right.equalTo(self).offset(-);
make.height.mas_equalTo();
}];
[_referrerBtn addTarget:self action:@selector(registerBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; //展开后收起按钮的设置
UIButton *arrow=[[UIButton alloc]init];
[arrow setImage:[UIImage imageNamed:@"log_ic_triangle_up.png"] forState:UIControlStateNormal];
[arrow addTarget:self action:@selector(closeClick:) forControlEvents:UIControlEventTouchUpInside];
[rf addSubview:arrow];
[arrow mas_makeConstraints:^(MASConstraintMaker *make){
make.centerY.equalTo(rf);
make.right.equalTo(rf).offset(-*kScaleH);
make.height.mas_equalTo();
}]; //打开推荐人cell
-(void)openClick:(UIButton *)sender{
_referrerBtn.hidden=YES;
rf.hidden=NO;
[_registerBtn mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_password.mas_bottom).offset( * kScaleH);
}];
} //收起推荐人cell
-(void)closeClick:(UIButton *)sender{
_referrerBtn.hidden=NO;
rf.hidden=YES;
[_registerBtn mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_password.mas_bottom).offset( * kScaleH);
}];

参考网页:Masonry介绍与使用实践iOS Autolayout之Masonry解读Masonry使用注意篇iOS Auto Layout官方文档

Mac Gif制作软件良心推荐:Giphy Capture (免费)【好看又好用,最关键免费啊!!!】

Masonry学习札记的更多相关文章

  1. BITED-Windows8应用开发学习札记之二:Win8应用常用视图设计

    感觉自我表述能力有欠缺,技术也不够硬,所以之后的Windows8应用开发学习札记的文章就偏向于一些我认为较难的地方和重点了多有抱歉. 上节课是入门,这节课就已经开始进行视图设计了. Windows应用 ...

  2. SQL菜鸟学习札记(一)

    刚开始学SQL,从最基础的语句开始写,用一个LOL数据库做实验.目前使用的工具是MySQL Workbench,感觉比较顺手,界面没花多久时间就读懂的差不多了,所以目前就使用这个工具来做SQL的学习了 ...

  3. java学习札记

    java学习札记 0x0 学习原因  本来打算大三再去跟着课程去学习java的,但是现在题目越来越偏向java,所以迫于无奈开启了java的学习篇章,同时也正好写个笔记总结下自己学习一门语言的流程. ...

  4. Java 学习札记(三)免安装版TomCat中tomcat6w.exe的运行

    1.使用环境 很多时候我们用的是官网的解压免安装版的Tomcat,相比安装Tomcat除了少了安装步骤以外还少了tomcat6w.exe运行所需要的环境变量,所以一般Java开发免安装版的已经足够使用 ...

  5. 2.2.1 用户态、内核态的形成 -《zobolの操作系统学习札记》

    内核态的出现,让计算机系统的权力向操作系统高度集中了. 操作系统分出内核态和用户态,就是为了进行不同等级的权限管理, 从而更好的适应多用户多任务并发的工作环境. 用户态和内核态的来源 在早期的单进程单 ...

  6. 2.2 追求并发的极致-线程概论 -《zobolの操作系统学习札记》

    2.2 追求并发的极致-线程概论 为了追求程序运行之间的并发性,计算机科学家们发明了进程.为了进一步的追求进程内部的并发性,工程师们又提出了线程. 正是线程的出现,给予了程序员更多地操纵OS的自由,可 ...

  7. 2.1 动为进程,静为程序 -进程概论 -《zobolの操作系统学习札记》

    2.1 动为进程,静为程序 -进程概论 目录 2.1 动为进程,静为程序 -进程概论 问1:发明进程的原因? 问2:现在计算机中的进程的定义是什么? 问3:为什么进程跟处理器的联系更密切? 问4:进程 ...

  8. 1.4 操作系统的其余功能 -《zobolの操作系统学习札记》

    1.4 操作系统的其余功能 操作系统除了虚拟化.并发.存储管理三个主要功能,还有许多子功能,我主要介绍几种常见的功能比如 目录 1.4 操作系统的其余功能 稳定性 高性能 隔离保护 易用性(可视化) ...

  9. 1.3 操作系统的第三个功能——存储管理功能 -《zobolの操作系统学习札记》

    1.3 操作系统的第三个功能--存储管理功能 作者zobol:关于操作系统概论-存储管理功能,我给出下列问题: 目录 1.3 操作系统的第三个功能--存储管理功能 问1:操作系统的文件管理系统主要是负 ...

随机推荐

  1. Python3+Flask安装使用教程

    一.环境配置 当前我的开发环境是Miniconda3+PyCharm.开发环境其实无所谓,自己使用Python3+Nodepad都可以.安装Flask库: pip install Flask 二.第一 ...

  2. ArrayList与LinkList

    1.ArrayList 1)继承结构 2)ArrayList是数组存储结果,初始容量为0,添加第一个元素后容器为10,后面每次超过容量时,容量递增50%,每次扩容都需要产生新的数组,再把老的数据复制过 ...

  3. 工作笔记6-java相关

    1.有时候安装失败或者要装新版本的JDK,可先卸载JDK: a.   首先执行命令查看服务器下的JDK的版本:命令如下:rpm -qa |grep jdk b.   然后执行命令:yum -y rem ...

  4. 详解Linux下swig 3.0.12的手动安装过程

    详解Linux下swig 3.0.12的手动安装过程 首先 从http://www.linuxfromscratch.org/blfs/view/cvs/general/swig.html上下载swi ...

  5. sface

    单步检测方法分为两类:anchor-based如ssd.RetinaNet;2)Anchor-free 如DenseBox.UnitBox;anchor-based处理的尺度范围虽小,更精准:anch ...

  6. redis学习——数据持久化

    一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久 ...

  7. spring MVC 入门:

    概述: MVC: M model 模型,除控制和视图以外,都可以成为模型. V view 视图,JSP,HTML,ASP,PHP,XHTML,FREEMARK,JSF,直接与用户做交互的资源. C c ...

  8. Unable to determine the device handle for GPU 0000:01:00.0: GPU is lost.问题排坑

    在运行maskrcnn时,会碰到训练不动的问题,就卡在这儿 UserWarning: Converting sparse IndexedSlices to a dense Tensor of unkn ...

  9. JS案例六_1:添加城市

    使用的相关知识点:对子节点的添加:document.appendClild() 文本节点的创建:document.createTextNode() 元素节点的创建:document.createEle ...

  10. eclipse起不起来web项目

    eclipse 启动java web项目tomcat无报错,但是项目没有启动成功,可能存在以下原因 1.Maven Dependecies 可能不存在 解决:点击Add将Maven Dependeci ...