开发中给图层做动画时,为了让图层在动画完成之后保持在动画完后的那一刻的状态,通常将动画的isRemovedOnCompletion设置为true, 并且将fillMode设置为kCAFillModeForwards,即可达到效果。fillMode除了可设置kCAFillModeForwards外,还有kCAFillModeRemoved、kCAFillModeBackwards、kCAFillModeBoth三个值。在分析这三个值之前,先来看看fillMode的定义。
fillMode 定义了计时对象在其非活跃时段的行为。CAAnimation子类的实例就是计时对象。对于CAAnimation来说,非活跃时段就是动画开始前和动画完成后的时间段。
接下来说说fillMode的四个值的作用:
kCAFillModeRemoved
:默认模式,动画开始前和结束后,动画对layer的状态没有影响。也就是说,动画开始前和结束后,layer都会处于添加动画前的状态。
kCAFillModeForwards
:动画结束后,layer处于动画结束那一刻的状态。
kCAFillModeBackwards
:动画开始前,layer处于动画开始那一刻的状态。
kCAFillModeBoth
:动画开始前,layer处于动画开始那一刻的状态;动画结束后,layer处于动画结束那一刻的状态。
kCAFillModeRemoved
对动画开始前和结束后两个时段都没有影响,在这两个时段,layer都将处于添加动画前的状态;
kCAFillModeForwards
影响的是动画结束后的状态,也就是说,动画完成后会状态会保持,不会突然回到原始状态。
kCAFillModeBackwards
影响的是动画开始前的状态。默认情况下,动画添加到layer上,会立即开始动画,这时不能对比出kCAFillModeBackwards与kCAFillModeRemoved的差异,要测试kCAFillModeBackwards的效果,需要将动画的fromeValue设置为与layer添加动画前的值不同(例如要对layer沿x轴作平移动画,layer的position.x原来为50,可以将动画的fromeValue设置成100),并设置beginTime将动画延迟一定时间。
kCAFillModeForwards
比较常用,影响的是动画结束后的状态。
kCAFillModeBoth
可以看作是kCAFillModeBackwards和kCAFillModeForwards的结合。
需要注意,fillMode不论设置什么值,显示动画都不会改变layer的模型图层,影响的只是layer的呈现图层。
下面来看看示例代码以及效果:
效果:
anim.fillMode = kCAFillModeRemoved
anim.fillMode = kCAFillModeBackwards
anim.fillMode = kCAFillModeForwards
anim.fillMode = kCAFillModeBoth