iOS 之动画

2016-01-04  本文已影响120人  PanPan1127

iOS 之动画

CALayer 和 UIView

> 原理:Core Animation 维护了两个平行 layer 层次结构: model layer tree(模型层树) 和 presentation layer tree(表示层树)。前者中的 layers 反映了我们能直接看到的 layers 的状态,而后者的 layers 则是动画正在表现的值的近似。

>实际上还有所谓的第三个 layer 树,叫做 rendering tree(渲染树)。因为它对 Core Animation 而言是私有的,所以我们在这里不讨论它。

> 考虑在 view 上增加一个渐出动画。如果在动画中的任意时刻,查看 layer 的 opacity 值,你是得不到与屏幕内容对应的透明度的。取而代之,你需要查看 presentation layer 以获得正确的结果。

> 虽然你可能不会去直接设置 presentation layer 的属性,但是使用它的当前值来创建新的动画或者在动画发生时与 layers 交互是非常有用的。

> 通过使用 -[CALayer presentationLayer] 和 -[CALayer modelLayer],你可以在两个 layer 之间轻松切换。

> 注意:动画完成后,presentationLayer将回到modelLayer 的位置。故动画结束,让 layer 停留在结束处的方案有2个:
    
>   * 直接在 model layer 上更新属性。这是推荐的的做法,因为它使得动画完全可选
>   * 设置动画的 fillMode 属性为 kCAFillModeForward 以留在最终状态,并设置removedOnCompletion 为 NO 以防止它被自动移除.(不推荐:如果将已完成的动画保持在 layer 上时,会造成额外的开销,因为渲染器会去进行额外的绘画工作)

* 核心动画:我们创建的动画对象在被添加到 layer 时立刻就复制了一份。这个特性在多个 view 中重用动画时这非常有用

POP 动画原理

CADisplayLink

else

CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
CVDisplayLinkSetOutputCallback(_displayLink, displayLinkCallback, (__bridge void *)self);

endif

//render

POP只需要根据各种动画的执行曲线,再考虑各种因素Bouncinesss, Speed, Tension等,计算出一个跟时间t有关的曲线,在render函数里得到当前时间,根据t来的到位置,再显示出来即可。可以看一下spring动画的曲线,

动画属性

基本的动画

优势:Pop Animation应用于CALayer时,在动画运行的任何时刻,layer和其presentationLayer的相关属性值始终保持一致,而Core Animation做不到。
Pop Animation可以应用任何NSObject的对象,而Core Aniamtion必须是CALayer。

上一篇 下一篇

猜你喜欢

热点阅读