iOS动画原理学习

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钟方式绘制:


iOS动画原理学习_第1张图片

时钟demo:GitHub - 969661780/ClockLayerAndCoreGragh

写demo不易,记得你的mark

你可能感兴趣的:(iOS动画原理学习)