iOS动画可以分为两大类:
1.系统提供的关键帧动画,用户指定关键信息,系统自动实现动画过程,对用户而言操作起来简单,譬如关键帧动画:用户指定起始位置,结束位置,动画时间,速度等就可以实现一个简单的动画
2.逐帧动画,用户自己画出每一帧的动画,系统操作方式简单,但用户的工作量不就大
逐帧动画:
周期性的绘制每一帧动画。
周期性:需要一个定时器来完成,既CADisplayLink。CADisplayLink于NSTimer类似,它是基于屏幕舒心的,既屏幕每一次刷新都会调用
绘制:不光是指覆写UIView的- drawRect:的方法来手动重绘视图,也包括修改UIView它的属性,比如位置、颜色等
iOS 的动画都是基于CALayer的,iOS 的UIView背后都有一个对应的CALayer。对UIView的修改实际上都是对背后CALayer的修改。
但如果在逐帧绘制的方法中修改了一个自建的CALayer,这个CALayer不是对应某个UIView的,需注意系统的隐式动画的影响
关键帧动画:也就是iOS里面的核心动画,了解:
初始位置,结束位置,速度,动画时间
1)位置,通过创建CAAnimation来设置动画的初始结束位置
CALayer的同一个属性值,会分别保存在模型层modelLayer,和展现层presentationLayer中。当我们修改属性值时,是修改的模型层的数值,动画时系统根据模型层的变化,生成的过渡值,是保存在展现层中的。而我们的动画实际是在展示层进行改变,当动画结束后切换到模型层的的最初值,其实不影响位置的改变。
而讲动画加入展示层的代码:- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key
接受的类型分为:
基础动画类型:CABasicAnimation
关键帧动画类型:CAKeyframeAnimation
组动画类型:CAAnimationGroup
过渡动画类型:CATransition
2)时间
动画持续时间通过CAAnimation遵守的CAMediaTiming协议设定的
3)速度
速度是通过设置CAAnimation的timingFunction实现的,这是一个CAMediaTimingFunction类的对象
隐式动画:系统自己添加的动画
当我们改变CALayer的一个可动画的属性值时,就会触发系统的隐式动画。
可动画的属性值,可以在CALayer的文档中找到,属性说明中标有Animatable的,就是可自动添加动画的属性。而UIView比较特殊,他的隐私动画默认是关闭的,而当animateWithDuration等动画方法被调用的时候隐私动画会被开启
动画事务:
创建动画事务的目的是为了操作的原子性,保证动画的所有修改能同时生效。
CATransaction就是动画事务的操作类。
在创建隐式动画的时候,系统也会隐式的创建一个动画事务,以保证所有的动画能同时进行。
除此之外,还可以显式的创建一个事务。
显式事务中可以定义事务中所有动画的运行时间和时间函数,此外,还有这个方法+ (void)setDisableActions:(BOOL)flag能显式的关闭这个事务中的 action 查询操作。
文章的目的是对:www.jianshu.com/p/13c231b76594进行学习总结,后面会有自己demo
写demo的总结:
1.动画的制造都是基于layer的,layer可以添加3D,2D来设置平移这些来添加动画。
git地址:GitHub - 969661780/CALayerDemo
2.通过核心动画CoreAnimation也就是QuartzCore来设置起点终点等动画
git地址:GitHub - 969661780/coreAnimation
3.更多的是绘图,绘图有2中方式:
(1) 通过贝塞拉曲线结合CAShapeLayer进行绘制,一般对于一个图层进行修剪注意mask属性。而此时做动画可以通过不断删除贝塞拉曲线和绘制达到动画效果
(2)通过CoreGraphics来进行绘制,CoreGraphics可能没有贝塞拉曲线那么高效,但是可以更加处理复杂的动画,但是这个内容有点多
做了一个时钟,通过2钟方式绘制:
时钟demo:GitHub - 969661780/ClockLayerAndCoreGragh