一、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树 数据结 ...
随机推荐
- Gson解析json字符串
// 解析传递过来的json字符串 JsonParser parser = new JsonParser(); JsonObject jsonObj = parser.parse(strJson).g ...
- NSURLConnection的使用
一:NSURLConnection(IOS9.0已经弃用)是早期apple提供的http访问方式.以下列出了常用的几个场景:GET请求,POST请求,Response中带有json数据 对于NSURL ...
- ubuntu下配置vpn
Ubuntu系统下搭建VPN环境 以下是基于Amazon EC2/Ubuntu搭建PPTPD服务提供VPN连接的过程记录.至于为什么要搞VPN,大家都懂的...而我主要是要访问Python的一些网站以 ...
- Android开发常见问题小结
1.布局文件 自己写的布局文件无得使用 原因:导入了系统的R文件 修改:将android.R 这句注释 或者删除 2.Activity作为主窗口设置 Activity无法启动,或者要设置Activit ...
- iis虚拟目录名称“ReportServer”的巧合
今天测试一个Crystal Report网站的报表服务,建立一个虚拟目录,名为ReportServer,结果无论怎样访问浏览器都返回 localhost/ReportServer - / Micr ...
- 浅谈CSRF攻击方式
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- 机器学习笔记—svm算法(上)
本文申明:本文原创,如转载请注明原文出处. 引言:上一篇我们讲到了logistic回归,今天我们来说一说与其很相似的svm算法,当然问题的讨论还是在线性可分的基础下讨论的. 很多人说svm是目前最好的 ...
- Node.js process 模块常用属性和方法
Node.js是常用的Javascript运行环境,本文和大家发分享的主要是Node.js中process 模块的常用属性和方法,希望通过本文的分享,对大家学习Node.js http://www.m ...
- QT中检索设定目录下所有指定文件的方法
void MainWindow::on_pushButton_clicked() { QDir dir=QFileDialog::getExistingDirectory(this, tr(" ...
- Linux中挂载window7的共享文件
window7主机: 设置要共享的文件夹 Linux Fedora: 0 su su root 1 samba-client yum install samba-client 2 cifs-utils ...