一、CoreAnimation之图层树详解
CoreAnimation :在字面意思为“核心动画”,但是如果您认为它仅仅是一个动画框架,那可能就要错过一些经典功能了。动画,只是CoreAnimation功能的一小部分,毕竟人家的源头是一个叫做Layer Kit的库演变而来,和动画无关。
CoreAnimation作为一个复合引擎,将不同的视图层组合在屏幕中,并且存储在图层树中,向我们展示了所有屏幕上的一切。而图层树又是什么呢?下面来探讨一下第一个概念图层树:
图层树:如果您开发过iOS/ipad应用程序,并且使用过Xcode中提供的一个如下图视图调试工具:
就会发现,视图上的所有子视图,都是有很明显的视图层次感的,其实,这就是图层树的一种不完全正确的表达形式。不完全正确是因为我们现在看到的,大部分是UIViewController和UIView对象的层次关系,真正的CALayer图层树,其实是CALayer对象组合而成,相信大家对CALayer都不算陌生,因此在这里就不多赘述,只做简单描述。
CALayer类在概念上和UIView类似,同样可以向UIView一样被层级关系树管理,也可以显示一些内容,也可以进行图层的位置变换,甚至可以像UIView一样来进行动画。它和UIView最大的不同就是CALayer不处理用户的交互行为,它并不清楚具体的响应链,因此它并不能响应事件,即使它提供了一些方法来判断某个触点是否在图层的范围之内。
每个UIView都有一个CALayer对象的图层属性,视图的职责就是创建并管理这个图层,以确保当子视图在层级关系添加或者被移除的时候,他们关联的图层也同样对应在层级关系中有相同的操作。而实际上,我们眼中的屏幕中的所有,都是UIView背后的那写layer对象来实现的,UIView的各种操作,仅仅是对layer的一个封装,并提供了一些响应功能和高级动画API。看到这里,可能有朋友会有疑问,既然关系为封装,为何又要进行UIView和CALayer的分离呢?为什么不直接使用一个层级进行响应事件和内容显示呢?原因在于要做到职责分离,这样也能避免很多重复代码。虽然它们功能上很相似,但在实现上具有显著的区别。
其实,一个视图上,不仅存在UIView和CALayer两个层次树,还存在呈现树和渲染树。当前层面仅供了解,后续会陆续讲到。
图层的功能:
如果说CALayer是UIView内部的具体实现细节,为什么我们还要全面的了解它呢,毕竟apple已经为我们提供了简单易用的UIView接口。在某种意义上来说的确是这样的,对一些简单的需求来说,我们确实没有必要处理CALayer,比如说简单动画,我们完全可以使用UIView提供的高级动画API。然而,举个小例子,如果我们需要一些自定义高级复杂的动画,你会发现,系统UIVIew的API,并不能满足或者说很难满足我们的需求,这时,我们就需要介入CoreAnimation底层之外了。这仅仅是个小例子,对于图层,它拥有UIView没有的功能如下:
- 阴影
- 3D变换
- 非矩形范围
- 透明遮罩
- 多级非线性动画
这些功能我们将在未来章节中继续讨论。
一、CoreAnimation之图层树详解的更多相关文章
- 数据结构图文解析之:AVL树详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
- JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删改查),事件
JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删 ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- Linux dts 设备树详解(二) 动手编写设备树dts
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
- Linux dts 设备树详解(一) 基础知识
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...
- AVL树详解
AVL树 参考了:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 修改了其中的错误,代码实现并亲自验证过. 平衡二叉树(B ...
- trie树--详解
文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作.关键词:trie trie树 数据结 ...
随机推荐
- 基于FPGA的飞机的小游戏
基于FPGA的飞机的小游戏 实验原理 该实验主要分为4个模块,采用至上而下的设计方法进行设计.由50M的晶振电路提供时钟源,VGA显示控制模块.图形显示控制模块.移动模块的时钟为25M,由时钟分频电路 ...
- js 判断各种数据类型
了解js的都知道, 有个typeof 用来判断各种数据类型,有两种写法:typeof xxx ,typeof(xxx) 如下实例: typeof 2 输出 number ...
- C# 与 SQLite的操作
1.通过Add References引用SQLite ADO .NET安装目录的bin目录下的System.Data.SQLite.DLL. 2.创建数据库文件:因为始终是个0字节文件,应该利用IO也 ...
- python select 实现
python的select()方法直接调用操作系统的IO接口 它监控sockets,openfiile,pipes (所有带fileno()的方法的文件句柄) 什么时候变成 readable writ ...
- Adapter的封装之路
原文:Adapter的封装之路 一.几种常见列表效果: 假如要用RecyclerView实现下面的几种效果,你会如何实现呢? 效果1:单布局效果 效果2:多布局效果 有多种Item布局 效果3 ...
- 【PHP】月末・月初の出力方法
文章出处 : Qiita - http://qiita.com/shoridevel/items/0a2f4a64e55d84919a1c 今月の月初 echo date("Y-m-01&q ...
- SVM(支持向量机)的一点理解
最近有被问到SVM的问题,不懂装懂,羞愧不已.百度有很多深入浅出介绍SVM的文章,我就不赘述了,这里写一点自己肤浅的理解. SVM的核心思想是把求解低维空间上的高维分类器转化为求解高维函数空间上的线性 ...
- yii 核心类classes.php详解(持续更新中...)
classes.php在yii运行的时候将被自动加载,位于yii2文件夹底下. <?php /** * Yii core class map. * * This file is automati ...
- JavaScript数组的方法
push() :将参数加载到数组的最后,返回数组的长度 pop() :删除数组的最后一个元素,返回删除的值 shift() :删除数组的第一个元素,返回删除的值 unshift ...
- Zabbix监控nginx-rtmp status(html版)
nginx-rtmp开启stats # nginx(--add-module=nginx-rtmp-module-master) nginx.conf: server { listen ; locat ...