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. 深入学习系列--Data Structure--02字符串

    字符串可以说是我们实际工作中使用最多的数据类型了,常见的字符串操作包括链接.取子串.格式化等.这部分内容总体来说比较容易理解,最难的部分要数字符串的模式匹配方法了,尤其是KMP算法,需要通过实践加以记 ...

  2. 18数据表&E-R模型&概念数据模型-下(选学)-天轰穿大话数据库视频教程

    关键字:数据表 三大范式 外键 主键 数据表设计 天轰穿 sqlserver 数据库大纲:属性与主键,外键&联系,三大范式,设计表时应该考虑的因素 土豆超清地址: 优酷超清地址: 原文地址:h ...

  3. 扩展easyui 的表单验证

    easyui 的validatebox()提供了自定义验证的方法,为此我把一些常用的数据验证汇总了一下,代码如下: 代码 $.extend($.fn.validatebox.defaults.rule ...

  4. 招聘:web前端开发(中级、高级均可)

    web前端开发(中级.高级均可) 工作地点:广东-深圳 工作年限:2年 学历要求:本科 招聘分类:前端开发工程师 工资范围:面议 招聘人数:3 发布日期:2014/07/29 截止日期:2014/08 ...

  5. jquery判断checkbox是否选中及改变checkbox状态(转)

    jquery判断checked的三种方法:.attr('checked):   //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false.prop('c ...

  6. (转)TRANSFORM_TEX详解

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 特别讲:常见问题回答   本讲会陆续补充一些问题的解答. 问: (1) TRANSFORM_TEX是做什么的 (2)float4 _Main ...

  7. Android开发的技术层次

    任何一种移动开发生态系统其技术人员都是呈现金字塔式分布的.我借此也说说Developer和Programmer的区别: Programmer是真正意义上的程序员,写程序的.灵魂级 Developer是 ...

  8. Docker实践(5)—资源隔离

    Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...

  9. 《CSS 设计指南》学习笔记 一

    本篇文章是对这几天看完 Charles Wyke-Smit 的 <CSS 设计指南> 后的一些学习笔记与心得,笔者好像是大一的时候开始接触网页设计,由于并不是计算机专业的,所以所有都是自己 ...

  10. icmp,tcp,traceroute,ping,iptables

    有东莞的监控主机到北京BGP出问题了: 报警短信疯狂发送: 找东莞IDC和北京BGP服务商协查: 有个奇怪的问题:北京到东莞trcaceroute都有路由信息 东莞143段到北京全无路由信息:但,东莞 ...