iOS开发--Core Animation(核心动画)(一)

Core Animation is a graphics rendering and animation infrastructure available on both iOS and OS X that you use to animate the views and other visual elements of your app.(苹果官方文档.见参考连接)html

从上面官方文档中咱们能够知道,Core Animation一个图像渲染和动画的底层架构。咱们主要是用它是咱们app中的视图或者其余可见部分动起来。架构

今天狠下心,花了一天的时间好好拜读了一下苹果的核心动画说明文档,虽然英文读的我很痛苦,可是仍是收获颇多。首先跟你们说一些理论性的东西,毕竟实现那一套东西已经被写烂了,实在写不出什么东西了。app

* 1 Core Animation自己不是一套绘画系统

也就是它自己不能进行视图内容的绘画。可是它能够基于硬件对你视图的内容进行合成和操做。重要的事情着重说:框架

框架的核心是层对象(CALyer Objects)

说完上面的东西你们内心应该大体记住两件事,1.Core Animation自己不能进行绘画,至于他怎么实现动画,一下子我会揭晓。2.Core Animation的核心是层对象。ide

* 2 CALyer的两套坐标系

首先声明一点,CALyer的在屏幕上显示的位置是这个二者相互重要的结果。工具

第一种坐标系 point-based coordinate systems ,这种坐标是我相信你们都很是熟悉,咱们日常对于视图的定位都是用的它。
动画

967672-73d0b817c0fd19a4.png
点坐标系.png

第二种坐标系unit coordinate systems单元坐标系,这个是我今天想要跟你们介绍的。苹果公司对于引入他的解释说的很是魔性,ui

Unit coordinates are used when the value should not be tied to screen coordinates because it is relative to some other value. For example, the layer’s anchorPoint property specifies a point relative to the bounds of the layer itself, which can change.翻译

967672-3d376923f9df5da8.png
单位坐标地.png

你们若是实在不懂,可使用翻译工具翻译一下看看。大意就是当这个值不和屏幕坐标绑定在一块儿,而是和其余的值有关,这个时候咱们要用到单元坐标系。好比说层的锚点就是和层自己的界限有关,而且它是可改变的。OK,经过这句话咱们要明白一点,也是你们常常犯迷糊的一点。重点我强调说:3d

修改单元坐标系的内容将会对点坐标系的设置产生影响。

怎么理解上面这句话那。举个例子,咱们见一个起始点为(50, 50),大小为(100,100)的CALyer添加到视图的子层上,这个时候咱们修改锚点为(0,0)(锚点默认(0.5, 0.5)),而且在此以后咱们打印这个层的起始点,发现此时起始点的坐标会变成(100, 100)。

最后在强调一下

CALyer显示的位置点坐标系和单元坐标系二者设置共同的做用的结果。变化范围x,y方向上都是0~1。

强势插入一波 position和 anchorPoint

position默认是CALyer的中心点坐标,注意,并非说position就是CALyer的中心点。当我建立CALyer时,他的值就肯定了,固然咱们也能够修改的他的值,用法相似于view的center。而锚点的使用来肯定当前position在CALyer的位置。

锚点修改的以后position在当前CALyer的位置,即单元坐标系中的位置,对于他在坐标系的位置无关。

强势分析一波。再用上面的那个例子,当前层的中心点坐标为(100, 100), position的坐标也为(100, 100), 锚点为(0.5, 0.5)。而后咱们修改锚点的为(0.0),也就是说咱们将position放到CALyer的起始点位置。由上面的说明咱们知道,此时position的点坐标位置不变仍是为(100, 100),那么此时层的中心点坐标就成了(150, 150)。如今你们明白为何修改锚点会改变CALyer的位置了吧。

* 3 CALyer与View的关系

CALyer View
可否建立可见图像 不能,必须依赖视图 可以直接建立
可否响应事件 不能
可否进行绘画 不能
除了展现图像的其余功能 不多 不少

通上表你们能够知道CALyer的局限性很大,为何还须要他那?主要是由于他能是图像绘画和运动变得更加简单,方便和高效。固然,这个CALyer的底层实现是密不可分的。CALyer的实现比不是调用底层硬件对图像就行重绘,而是经过对图像对象对应的数字位图(一种图片格式)进行操做,在深刻的做者我就不懂了。

* 4 动画的两种方式

设置动画主要分为两种,属性动画和关键帧动画。
属性动画:这个很好理解,相信大部分也都曾用到过.属性动画就是经过对当前层属性的修改,从而达到图像改变或运动的目的.至于可修改的属性以及怎样修改,我稍后会更新一片实战的,到时候你们能够用心感觉一下.
关键帧动画:这个对于你们可能有点陌生.实力分析一波,咱们将动画分红几个关键的帧,而后让他在必定时间的运行,以这样的方式实现的动画就是关键帧动画.
除了上述的两种动画之外,苹果公司还提供了大量的自定义动画,他们都是CALyer的子类,实现了莫一种特殊的动画.有兴趣的朋友能够研究一下.

* 5 设置CALyer的内容

1.直接用图片作为内容
由于层是一个管理位图的容器,因此能够直接将一个图片对象赋值给层的contents属性.
2.调用代理方法
这种能够动态的为CALyer添加内容,代理方法有两个
若是是调用的displayLayer方法,核心动画将会根据代码建立位图赋值给layer的contents属性.
若是调用drawLayer : inContext方法.那么核心动画会建立一个绘图上下文,咱们能够将代码写在其中,而后调用这个代理,将图像写入位图中,而后默认调用displayLayer方法赋值给layer的contents属性.

或许还有不少理论性的东西我没有注意到,毕竟我只拜读一边.苹果的动画作的算是至关不错.如此优秀东西的介绍岂会被我一遍所有领会,我会抽时间再去拜读,若是有新领悟,我会更新这篇博文.

About Core Animation