【转】有趣的Autolayout示例-Masonry实现
原文网址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/
好久没有写Blog了,这段时间有点忙啊=。=
本文举了3个比较有“特点”的Autolayout例子,源于微博上好友的提问,感觉比较有意思,也比较有代表性,就写了出来,分享给大家~
至于为什么用Masonry,那是因为它好用啊!(被问到过有关Masonry的问题,就索性用它来实现吧=。=)。
效果图

Github地址
https://github.com/zekunyan/AutolayoutExampleWithMasonry
关于例子工程结构
实现的时候采用的是用StoryBoard拖拽约束+Masonry手写代码相结合的方式实现。最关键的地方是用Masonry,为了更好地突出重点。其它的无关紧要的空间约束,直接就拖拽了。
关于Autolayout
刚开始学习Autolayout的时候,什么“Leading Edges”、“Horizontal Centers”,好多啊,感觉一下子适应不来,有时候面对一个界面布局上的需求,可能都无从下手。
总的来说,我觉得Autolayout的关键就是“Constraint(约束)”。其实就是以下两点:
- 从显式设置frame的属性,到利用约束控制View的大小、位置。
- 思考如何布局时,重点从单个的View,到整体所有View之间的相互关系。
既然没有了具体设置View的frame属性,也就是说,系统会在运行时,通过我们设定的“约束”,计算出每个View的frame,再去绘制屏幕内容。
也就是说,我们设置的Constraint,要能体现出View的位置(x、y坐标)、大小(宽高)。无论是用IB拖拽约束,还是手写代码,只要从这个角度去思考,很多问题就都能解决。
有关Autolayout的知识,网上有很多,在这里就不详细列出了,但是有个公式倒是可以贴出来:
1 |
viewA-attribute = viewB-attribute * multiplier + constant |
关于Masonry
好用!
Case 1: 并排两个label,宽度由内容决定。父级View宽度不够时,优先显示左边label的内容
遇到这种跟内容压缩、优先级有关的布局,就不得不提Autolayout中的两个重要的属性“Content Compression Resistance”和“Content Hugging”。
Content Compression Resistance = 不许挤我!
对,这个属性说白了就是“不许挤我”=。=
这个属性的优先级(Priority)越高,越不“容易”被压缩。也就是说,当整体的空间装不下所有的View的时候,Content Compression Resistance优先级越高的,显示的内容越完整。
Content Hugging = 抱紧!
这个属性的优先级越高,整个View就要越“抱紧”View里面的内容。也就是View的大小不会随着父级View的扩大而扩大。
分析
根据要求,可以将约束分为两个部分:
- 整体空间足够时,两个label的宽度由内容决定,也就是说,label的“Content Hugging”优先级很高,而且没有固定的Width属性。
- 整体空间不够时,左边的label更不容易被压缩,也就是“Content Compression Resistance”优先级更高。
重点:
- label不设置具体的宽度(width)属性,宽度由内容决定。
- 显示的优先级由“Content Compression Resistance”属性的高低决定。
约束示例图

关键代码
关键的代码如下:(label1是左边的label,label2是右边的)
设置位置
1 |
// label1: 位于左上角 |
设置内容约束
1 |
//设置label1的content hugging 为1000 |
小节
灵活运用“Content Compression Resistance”和“Content Hugging”属性。
Case 2: 四个ImageView整体居中,可以任意显示、隐藏
先看看示例的截图:

下面的四个Switch控件分别控制上面对应位置的图片是否显示。
分析
- 首先就是整体居中,为了实现这个,最简单的办法就是将四个图片“装进”一个容器View里面,然后让这个容器View在整个页面中居中即可。这样就不用控制每个图片的居中效果了。
- 然后就是显示与隐藏。在这里我直接控制图片ImageView的宽度,宽度为0的时候不就“隐藏”了吗。
约束示例图

解释
之所以这么设置,主要目的有以下几点:
- 尽量减少无效的约束,保证约束不多也不少。
- 内部的每个imageView约束其实都只有四个:left、centerY、width和height,这样有个好处,就是可以在循环里面依次添加约束,大大减少代码量。
- 最右边的imageView还要单独设置跟容器View的右边约束,是为了不用设置容器View的width,保证容器View是刚好包含内部的View的,这样整体才是居中的。
关键代码
先看看最外层容器View的代码:
1 |
//containerView 就是 容器View [_containerView mas_makeConstraints:^(MASConstraintMaker *make) { |
循环创建每个内部的imageView
1 |
//循环创建、添加imageView |
最后是循环对imageView加上约束: 感谢XVXVXXX的PR:-D
1 |
//设定大小 |
控制ImageView显示、隐藏的时候,直接让其宽度等于0就行:
1 |
- (IBAction)showOrHideImage:(UISwitch *)sender { |
小节
有时候用个“容器View”管理内部的View,往往会起到事半功倍的效果。而且在组织约束的时候,尽量的将约束统一起来,这样可以用一个函数去设置,减少代码量。
Case 3: 子View的宽度始终是父级View的一半(或者任意百分比)
其实这个很简单=。= 再看看这个公式:
1 |
viewA-attribute = viewB-attribute * multiplier + constant |
这个是Autolayout里面一个约束的不同属性的基本组合关系,替换成宽度的话,就是下面这样:
1 |
子View的宽度 = 父级View宽度 * 系数 + 常数; |
在Masonry里面,其实有个函数“multipliedBy”,就是用来设置multipler属性的(跟原本的NSLayoutConstraint的对应)。
关键代码
如下:
1 |
[subView mas_makeConstraints:^(MASConstraintMaker *make) { |
接着,只要控制父级View的宽度,子View的宽度就会随着变化了。
小节
multipliedBy在Masonry的Github主页里面没有=。=
所以要养成读头文件的习惯~
总结
有关Autolayout的东西还有好多没有写,什么动画啊、动态修改约束之类的,本文也算是个引子吧,任重而道远~
能看到这的朋友,也算是很有耐心了,哈哈~~
参考
【转】有趣的Autolayout示例-Masonry实现的更多相关文章
- AutoLayout框架Masonry使用心得
AutoLayout框架Masonry使用心得 字数1769 阅读1481 评论1 喜欢17 我们组分享会上分享了页面布局的一些写法,中途提到了AutoLayout,会后我决定将很久前挖的一个坑给填起 ...
- iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)
iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫 ...
- iOS AutoLayout自动布局&Masonry介绍与使用实践
Masonry介绍与使用实践:快速上手Autolayout http://www.cnblogs.com/xiaofeixiang/p/5127825.html http://www.cocoachi ...
- iOS — Autolayout之Masonry解读
前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...
- IOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 转载
http://blog.csdn.net/he_jiabin/article/details/48677911 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为 ...
- 代码方式使用AutoLayout (NSLayoutConstraint + Masonry)
随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫切和必要.(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhone 6p/6ps ...
- AutoLayout初战----Masonry与FDTemplateLayoutCell实践
学iOS也有几个月了.一直都是纯代码开发,菜鸟入门,到今天还处在Frame时代.刚好近期项目在提审.有点时间能够学学传说中的AutoLayout.事实上.就是android的相对布局(Relative ...
- 在 AutoLayout 和 Masonry 中使用动画
动画是 iOS 中非常重要的一部分,它给用户展现出应用灵气的一面. 在动画块中修改 Frame 在原来使用 frame 布局时,在 UIView 的 animate block 中对 view 的布局 ...
- Autolayout 第三方开源库
转载自:http://blog.csdn.net/hmt20130412/article/details/46638625 今天才发现CSDN支持markdown了…还是给出新博客地址:Autolay ...
随机推荐
- GCD异步加载网络图片
//image dispatch_queue_t network_queue; network_queue = dispatch_queue_create("com.myapp.networ ...
- oracle 笔记
1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...
- MongoDB 性能优化五个简单步骤
MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracl ...
- java.util.ResourceBundle
转载自: http://lavasoft.blog.51cto.com/62575/184605 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译 ...
- SDUT2482二叉排序树
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2482&cid=1184 题目描述 二叉排序树的定义是:或者是一棵空树,或者是具有下列性质 ...
- mysql 多表 update sql语句总结
mysql 多表 update 有几种不同的写法. 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductP ...
- Java学习笔记(一) java介绍
编程语言分为:编译型语言和解释型语言. 编译型语言需要经过特定编译器通过一次性编译,成为该特定平台硬件可执行的机器码,可脱离开发环境独立运行,运行效率较高,但是无法跨平台移植. 解释型语言需要经过特定 ...
- 用DateTime.ToString(string format)输出不同格式的日期
http://www.cnblogs.com/xvqm00/archive/2009/02/19/1394093.html DateTime.ToString()函数有四个重载.一般用得多的就是不带参 ...
- Android:储存方式之SharePreferences
使用SharedPreferences保存数据,其实质是采用了xml文件存放数据, 存储位置:/data/data/<package name>/shared_prefs 写入: publ ...
- PowerDesigner模型设计
原文:PowerDesigner模型设计 绪论 Sybase PowerDesigner(简称PD)是最强大的数据库建模工具,市场占有率第一,功能也确实十分强大,现在最新版本是15.1,已经支持最新的 ...