从苹果文档学习CoreAnimation(二)

就按照官方文档的目录来学习好了,其实我就是想看看纯学文档有什么好处以及能学到什么程度。

       首先第一部分是CoreAnimation的基础(Core Animation Basic)

该部分首先介绍了CoreAnimation大致的用途,除了上一篇说的工作原理,这里还说明了,CoreAnimation不是用来替代UIView,具体说就是不是用来替代UIView内容一秒60次刷新的机制(You would typically not use Core Animation to replace the content of a view 60 times a second),通俗点讲就是UIView利用drawRect重绘机制生成动画的途径。CoreAnimation是用来改变UIView内容的一些性质,来达到移动,淡出淡入,变形等动画效果。由于layer是管理位图(bitmap,上一篇有提过)的状态信息,例如,旋转(rotation),中心点(position),所以它是CoreAnimation的核心处理对象。

基于layer层的动画(Layer-Based Animation

layer包含的位图状态信息经过绘图硬件处理后会显示在屏幕上,也就是APP上的图形。如果图形已经绘制在屏幕上的时候,我们再修改layer层上的位图信息的话,就会产生最基础的动画,比如改变layer里面position的值,就会产生一段图形从旧的position移动到新的position的动画,有点像flash补间动画,系统会自动在两个position中插值,来形成动画。下面这张图是一些你能layer层操作的变化。

它的原理是通过硬件逐帧地重画,区别于drawRect利用cpu和软件的重画,它的效率会高得多,只需要设置起始点跟终点就能形成动画,当然也可以设置动画播放的时间,不设置的话就利用默认值。这是layer层上的基础动画。

layer对象定义了自己内容的几何学(Layer Objects Defind Their Geometry)

layer对象的其中一个任务就是管理自己内容几何学当中的一些性质,这些性质包括内容的边界大小(bounds),在屏幕中的位置(position),还有内容是否被旋转(rotated),缩放(scaled),各种方式的变换(transform),其实View中也有相应地性质,但其中有一个UIView没有的性质,锚点(anchorpoint),后面应该会详细介绍,这里只是说了它会影响一些对内容的操作。通过这些性质我们就能定义layer的几何学。(其实就是内容的大小,位置,怎样显示,有没有被旋转之类的,英语渣渣,请原谅)。

这里要说到layer是通过两种坐标系统来定义它自己的内容的,一种是普通基于点的坐标(point-based coordinate systems),以position为例子,position代表的是内容的位置,那么它基于的坐标就是它的父类,可能是屏幕的坐标系(左上角为原点坐标向右下角增加的标准坐标系),或者也有可能基于它的父图层(superLayer),不管哪一种,都是通过具体的点坐标来定义位置;另外一种是叫做单位坐标(Unit coordinates),它不是通过点,而是相对于一些其它的值,锚点就是通过这种坐标系统定义的,它具体说明了相对于Layer边界的一个点,这个点是可以改变的。(这里说得比较笼统,后面会有详细介绍)。

第一种坐标系统常用的地方时定义一个layer内容的大小和位置,也就是(bounds)和(position),文档提到layer也有frame属性(就是原点加上大小,也是可以定义内容的位置)但是在layer层上不常用。

position属性默认是以layer内容的中心为准。这时候就可以说说anchorPoint了,anchorPoint是使用单位坐标的,所以它的取值是0 ~ 1,有点像比例,内容的右上角是(0,0),左下角是(1,1),它可以定义position位于图层的位置,上面说到position默认的位置是在中央,是因为anchorPoint为(0.5,0.5),如果改为(0,0),那么position就会移动到左上角,需要注意的是,它并不是改变position的坐标值,而是改变图层的位置,去适应position的值,看图应该会更好理解。


官方给的示例图跟我讲的是有区别的,它既改变了anchorPoint的值(从0.5到0),也改变了position的值(从(100,100)到(40,40))来使得图形本身的位置不发生变化,如果你只改变了anchorPoint,那么本例中,图形就会相对于第一张图向右下角移动。(先不看图中右边的示例(OS X),OS X的坐标系其实就是把原点放在了左下角,其它没有变化)。

上面说到anchorPoint会影响你对layer图形的操作,比如,如果anchorPoint处于图层的中间,那么在使用layer的旋转性质的时候,它是基于中心点旋转,如果anchorPoint是在左上角,俺么图层会基于左上角旋转。

Layer 可以在三维空间操作(Layers Can Be Manipulated in Three Dimensions)

这里要讲到layer的一个属性,transform,它是通过将坐标值乘以一个矩阵获得图形的变换来实现的,比如旋转啊,缩放,只是我们再二维空间中可以直接使用layer的旋转属性,缩放属性来做到这些效果。又比如你只要子图层(suplayer)发生变换,你就可以使用它的sublayerTransform属性去实现。

然后三维的变换,是通过乘以一个4x4的矩阵做到的,当然,我们要作一些普通的三维变换,如缩放啊,旋转,不需要了解矩阵的具体组成,Core Animation提供了一些函数,你只要提供变换的值,以及变换的关键路径(key paths),就可以做出相应地变换

图层(Layer)树反应了不同方面的动画状态(Layer Trees Reflect Different Aspects of the Animation State)

如果你使用了CoreAnimation,那么它就有三种不同图层对象的集合,分别扮演不同的角色。

模型层的树(model layer tree)中的对象,是用来与app进行交互的,它存储了任何动画的目标值(也就是你动画进行到最后的图层属性target value),无论你什么时候改变图层的属性,你都是使用这些对象中的一个。

展示层的树(presentation tree)中的对象包含一个随时变化的值(因为动画是在时刻进行着),不同于模型层上的对象,它表示的是当前运行动画的一些属性值(current value),这些值是只读的,你可以创造一些新动画基于这些值。

render tree (不懂应该怎么翻译)中的对象是用来实际展示动画的,它对于Core Animatio来说是私有的。

图层也有等级制度(就是父图层,子图层一样),图层寄宿在UIView上面,但是图层在APP中可以单独建议,这表示它不一定得跟UIView绑定,它可以寄宿在它的父图层当中,形成一个图层树。而对于每个在图层树中的对象,都有一个匹配的展示层对象,以及一个render tree中的对象,app是通过与图层树经行交互的,但有时是从展现层上面取值的,因为你可能想要知道动画过程的属性值。

图层(Layers)和视图(Views)的关系(The Relationship Between Layers and Views)

图层不能用来替代视图,你不能创造一个可视的画面仅仅基于图层对象,图层是为视图提供一种图形基础,尤其是,图层能很简单地绘制和形成视图的动画并且保持高帧率,但是还是有很多事情视图没办法完成,图层不能处理交互事件,尤其是响应链,因为这个原因,每个app必须至少拥有一个视图。

iOS中,视图都默认有一个与它相符合的图层,OS X则不然。。。

iOS中基于图层的UIView,系统会制造一个图层并且跟视图保持同步。

这是官方文档中的第一部分内容,里面一些具体的代码并不在这部分内容上,按照它的顺序加上自己的理解写的,感觉并不是很清晰,也是花了差不多两个小时啊。。。而且我已经事先读完了,后续有精力再继续更新,反正也没人看,嘻嘻~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值