动画效果并不受限于某一个框架,iOS动画绝对不等于coreAnimation,提供一些动画api也只是coreAnimation冰山一角.
虽然不受限于框架,但是毕竟还得用API来实现动画,只考虑常规UI动画的话,基本上是UIKit,CoreAnimation,CoreGraphics这三个了.
另外ImageIO可能也算,毕竟gif也是动画,需要用ImageIO来解析gif.
上面都是中上层框架,此外还有更底层的用OpenGL/Metal来绘制动画.
涉及的领域包括图形学基础,iOS线程与UI的关系,coreAnimation渲染流程,GPU与CPU如何分工,以及显示器的工作原理等等.
从动画的表现来说:
1.它可以是内容的变化,比如图片切换,包括其变换形式,比如渐变,翻页,翻滚等等;
2.也可以是2d或3d的仿射变换,平移,缩放,旋转;
3.可以是颜色与透明度的变化.
4.可以是图形绘制的变化,从一个点,到一条线,到一个图形.
从实现动画的角度来说,可以是:
1.使用框架的API实现,比如把定时器+透明度换成CABasicAnimation.框架不仅仅提供了如何实现动画,还提供了一些预设算法,比如timing函数,比如贝塞尔曲线,以及物理引擎等.
2.通过修改载体的属性来实现,前面说到动画的表现,实现这些表现就可以了,例如整一个定时器,定期改变载体的属性,比如坐标,比如透明度.这方面主要是在框架不能满足需求的时候使用(其实更多的时候是我们不知道框架能做这种事,或者说不了解框架).
通过CoreGraphics来实现动画,主要用来实现图形绘制,本身和动画没啥关系,实质就是实时的高频率的绘制形成动画效果.
本身并没有提供与动画相关的API,只能通过第一条来实现动画.
主要是为了解决只能用CoreGraphics来绘制的图形,它所产生的动画.
比如扇形或者环形的图表,或者一些线条与色块变换的这种图标动画.
CoreAnimation的脉络:图层树 -> 视觉效果 -> 寄宿图 -> 仿射变换 -> 专用图层 -> 隐式与显式 -> 速度函数 -> 图层时间 -> 图像IO -> 性能调优.
CALayer及其各种子类,可以使用第一条来实现动画.
CAScrollLayer类似UIScrollView的效果;
CATiledLayer图层缩放,使用异步实现加载查看大图;
CATransformLayer实现真正的3D图层,而不是仿射变换;
CAReplicatorLayer可以制作图层的副本,这些副本可以应用不同的仿射变换和颜色;
另外还有一些用于Metal和OpenGL的CALayer子类.
并且CAAnimation及其子类提供了专门的动画API,对应实现动画的第二条.
CAPropertyAnimation属性动画,可作用于CALayer的带有Animatable描述的属性.但它是抽象类,不直接使用.
CABasicAnimation继承自CAPropertyAnimation,使用它实现属性动画.
CAKeyframeAnimation利用timingFunction实现自定义的帧动画.
CASpringAnimation在属性动画的基础上实现弹性效果.
使用CAEmitterLayer和CAEmitterCell实现粒子效果,前者是显示层,后者是控制器.
以及与速度相关的CAMediaTimingFunction,用于定义时间函数,有预定的值比如淡入淡出等等.或者使用贝塞尔曲线实现.
CADisplayLink或者NSTimer控制绘图与屏幕刷新同步,协议CAMediaTiming对"时间"的定义.
CATransition转场动画,
包括movein,reveal,push,fade,pageCurl,pageUnCurl,cube,oglFlip,stuckEffect,rippleEffect,cameraIrisHollowOpen,cameraIrisHollowClose等.
CATransaction隐式事务.
UIKit是个大杂烩,实现动画的API也是花样繁多,并且提供了一套实现动画+控制动画进程+获取动画状态的API.
甚至还准备了物理引擎UIDynamicAnimator.定义了一些物理行为如碰撞,重力,弹性,加速度等.甚至还可以描述物理中场的概念.
不仅是对CoreAnimation的封装,还增加了很多扩展.
UIViewPropertyAnimator来实现属性动画,
UIViewAnimating协议控制动画的状态,包括活跃(开始与暂停)和非活跃(取消与完成),
UIMotionEffectGroup实现动画组,
UIViewImplicitlyAnimating在动画的进程中修改,
UITimingCurveProvider设置时间函数.
此外最熟悉的还得是UIView中提供的一些方法, animateWithDuration系列, transitionWithView系列和animateKeyframesWithDuration等.
还有视图控制器转场动画相关的View controller transitions,通过一系列代理来自定义转场动画以及获取动画状态.