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. python数据可视化

    1.安装matplotlib 在 cmd 中键入 python -m pip install matplotlib,系统将自动安装,需要等一段时间,待完成后 python -m pip list ,显 ...

  2. vue-calendar 基于 vue 2.0 开发的轻量,高性能日历组件

    vue-calendar-component 基于 vue 2.0 开发的轻量,高性能日历组件 占用内存小,性能好,样式好看,可扩展性强 原生 js 开发,没引入第三方库 Why Github 上很多 ...

  3. WPF listbox实现多列显示数据

    一.每行显示固定列数 <ListBox ItemsSource="{Binding DataList}" Style="{DynamicResource ListB ...

  4. NFS, web,负载均衡,Nginx yum 源码安装

    作业一:nginx服务1.二进制安装nginx 2.作为web服务修改配置文件 3.让配置生效,验证配置  [root@localhost ~]# systemctl stop firewalld.s ...

  5. 嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  6. 【转载】JsonLayout log4j2 json格式输出日志

    JsonLayout log4j2 json格式输出日志 如果日志输出时,想改变日志的输出形式为Json格式,可以在log4j2.xml中使用JsonLayout标签,使日志输出格式为Json格式. ...

  7. 显式拥塞通告(ECN)及其在Linux上的实现

    1 ECN简介 首先看看ECN握手报文的特点,根据RFC3168,ECN握手报文IP头部不能够设置ECT和CE位的 SYN报文TCP标志字段的CWR和ECE位被置1 SYN-ACK报文的CWR位被置0 ...

  8. Django基础-01

    Django 是基于 Python,所有的 Django 代码都是用Python写成的. Django 特点 强大的数据库功能 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生 ...

  9. 前端校验框架ValidForm之check方法修正

    用过validform的朋友相信都知道,在利用check方法的时候,发现该方法对表单输入值只要符合datatype规则的就返回ture.那么我们想对某个字段进行ajax重复校验的时候,只需要在该表单元 ...

  10. mui框架上下拉加载

    mui框架被定位为“最接近原生体验的移动App的UI框架”. 写下mui框架中常用的两个功能,下拉刷新和上拉加载,没有后台交互,用js写假数据模拟,下面直接上代码. <!DOCTYPE html ...