iOS Core Animation 动画 入门学习(一)基础

  reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004514

  在iOS中,每个view中都自动配置了一个layer,我们不能人为新建,而在Mac OS中,view默认是没有layer的,需要手动设置是否开启layer(10.8以后默认是开启状态),因为开启layer是需要一定代价的,那就是需要开销额外的内存。

  view负责显示的内容,而layer负责显示内容的几何特性,在屏幕上的位置,是否被旋转、缩放,透明度等变化。

  和view一样,layer也有frame和bounds两个属性,但我们无法人为的改变frame的值,frame是由position和bounds两个属性决定的。bounds很好理解,一宽一高,决定了自己的大小。而position是相对于父视图的位子坐标。需要注意的是,到底是哪个点相对于父视图的坐标呢?这里我们需要先了解一个属性的概念:anchorPoint(锚点)。它是一个单位向量,x,y都是一个[0.0,1.0]的float值,用来表示position相对于自身宽高的比重,默认值是(0.5,0.5),即在layer的中心点。

  看一个例子,我们就很容易理解position,bounds,anchorPoint的关系了。(iOS的坐标系是左上为原点,OS X则是左下为原点的,这里主要说iOS)

  

  这也anchorPoint究竟有什么用呢?在静止的时候我们还真看不出来,anchorPoint不同对整个layer有什么影响,我们再来看看另一张图:

  

  哈哈,顾名思义,锚点就是固定点的意思嘛,如果执行旋转的话,就是绕着锚点转呗。当然,如果移动位置的话,也是相当于拉着这个锚点在动。

  position和anchorPoint其实是一个点,只不过position是个Point,而anchorPoint是个向量。所以position+anchorPoint+bounds就能确定一个Layer。

  想学动画,光在平面上动来动去,转来转去也没啥意思啊,Layer还支持3D动画(其实个人感觉应该叫伪3D,哈哈)。

  这里我们先要来了解一个属性,transform(变化矩阵)。每个layer有两个transform,transform&sublayerTransform。transform同时对layer和它的sublayer起效,用来执行缩放,旋转,移动等动画。sublayerTransform顾名思义只是针对sublayer的变化,通常用来给它的展示内容添加透视效果。

  tranform实际上是一个4x4的矩阵,如图:

  

  数学好的同学们应该一看就知道什么意思,不过好在我们几本不用直接操作这个矩阵,用设置键值对的方式就可以完成几本的矩阵变化,参考 CATransform3D Key Paths

  看看下面的demo,我们就可以大概了解矩阵里每个值代表什么含义了。

  

  identity是默认情况下的单位矩阵,没有任何变化。

  translate是平移矩阵,变化后为[x+tx, y+ty, z+tz, 1]。

  scale是缩放矩阵,变化后为[x.tx, y.ty, z.tz, 1]。

  后面三个分布是以x轴,y轴,z轴为轴,旋转角度θ,以以x轴旋转为例,变化后为[x, y.cosθ+z.sinθ, -y.sinθ+z.cosθ, 1]。

  刚开始的时候可能比较晕,没关系,iOS系统给我们提供了专门执行这些常用变化的函数,参考Animation Function Reference

  layer跟view一样,用树形结构来组织,Core Animation的App用3套layer对象来控制在屏幕上动态显示的内容。

  model layer tree:简称layer tree,就是我们印象中的layer的模型,这里面存储了所以的变化信息,当你修改layer的属性时,就有用到这里的对象。

  presentation tree:动态树,用来存储layer在屏幕上执行动画的某时刻的值,不能修改它的值,可以用它的值来判断是否要开启新的动画,或者判断碰撞等。

  render tree:渲染树,提供真是的动画,对Core Animation是不可修改的。

  每套layer对象的树形结构都跟view的树形结构完全吻合,每个view都会有layer对象与之对应。但是有点跟view tree不太一样的地方是,layer的树形结构中可以加入额外的layer对象,我们可以在不影响view开销的情况下,加入额外的layer对象来优化view的动态效果。

  注意:presentation tree只能在动画执行的过程中读取,不像layer tree那样,读取时总是反应了layer动画的最终状态。

  本次总结主要是对Layer的理解,大家是否对frame,bounds,position,anchorPoint,transform等属性,还有layer的三种树形结构有了更深的认识了呢?新手们大家一起学习进步,同时也欢迎大师们批评指正

转 iOS Core Animation 动画 入门学习(一)基础的更多相关文章

  1. iOS Core Animation 动画 入门学习(一)基础

    reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide ...

  2. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  3. iOS Core Animation 简明系列教程

    iOS Core Animation 简明系列教程  看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽 ...

  4. IOS Core Animation Advanced Techniques的学习笔记(五)

    第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...

  5. IOS Core Animation Advanced Techniques的学习笔记(一)

    转载. Book Description Publication Date: August 12, 2013 Core Animation is the technology underlying A ...

  6. IOS Core Animation Advanced Techniques的学习笔记(四)

    第五章:Transforms   Affine Transforms   CGAffineTransform是二维的     Creating a CGAffineTransform   主要有三种变 ...

  7. iOS Instruments之Core Animation动画性能调优(工具复选框选项介绍)

    Core Animation工具用来监测Core Animation性能.它给我们提供了周期性的FPS,并且考虑到了发生在程序之外的动画(见图12.4) Core Animation工具提供了一系列复 ...

  8. iOS Core Animation学习总结(1)--CALayer常用属性

    图层是core animation的基础, UIView之所以能显示在屏幕上,靠的是其内部的这个图层,即每个UIView 都有 CALayer,可通过UIView.layer或者[UIView lay ...

  9. iOS Core Animation之CALayer心得

    使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的AP ...

随机推荐

  1. 如何使用代码动态的获取和设置ImageView的宽度和高度?

    http://blog.csdn.net/wulianghuan/article/details/8644144 国内某金融企业的一道面试题:如何在代码中获得一个ImageVIew的高度和宽度? 相信 ...

  2. 充分利用 UE4 中的噪声

    转自:https://www.unrealengine.com/zh-CN/blog/getting-the-most-out-of-noise-in-ue4 UE4 推出基于材质的程序式噪声已经有一 ...

  3. [leetcode]Maximum Product Subarray @ Python

    原题地址:https://oj.leetcode.com/problems/maximum-product-subarray/ 解题思路:主要需要考虑负负得正这种情况,比如之前的最小值是一个负数,再乘 ...

  4. OpenCV仿射变换+投射变换+单应性矩阵

    本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ esti ...

  5. 一次完整的HTTP事务分析

    在浏览器中输入一个地址,按下回车之后,到用户看到页面之前,发生了什么? https://www.processon.com/view/link/56c6679ce4b0f0c4285e69c0

  6. 每日英语:The Secret About Online Ad Traffic: One-Third Is Bogus

    Billions of dollars are flowing into online advertising. But marketers also are confronting an uncom ...

  7. android 左右翻页

    布局: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android ...

  8. [转]gulp构建前端工程

    摘要: Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务: 搭建web服务器 文件保存时自动重载浏览器 使用预处理器如Sass.LESS 优化资源,比如压缩CSS.JavaScript. ...

  9. Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法

    错误为:为应用程序池“XXXXXX”提供服务的进程在与“Windows Process Activation Service”通信时出现严重错误.该进程 ID 为"XXX".数据字 ...

  10. Spring3系列7- 自动扫描组件或Bean

    Spring3系列7- 自动扫描组件或Bean 一.      Spring Auto Scanning Components —— 自动扫描组件 1.      Declares Component ...