在网上看了几个网友写的跑马灯效果,实现方式大同小异,都是使用UIView动画,在动画完成时再调用动画本身,无限的递归调用。这种方式有一个缺点,就是当界面切换或者APP切到后台的时候,动画会被系统强行停掉,然后再切回来的时候重新开始新的动画。另外我们希望滚动的文字动画是从最左侧开始,然后文字从右侧出来,这样重复循环,UIView动画也无法很好的支持。
于是我使用CABasicAnimation进行实践,CABasicAnimation支持这样的一个属性removedOnCompletion。这个属性默认是YES,当我们将他置为NO之后,切换界面或者APP切后台的时候,动画就不会被强行停止,还会继续执行。这样就解决了第一个问题。解决第二个问题的方式是将动画分为两段执行,第一个段动画将文字Layer从左侧屏幕边缘开始,一直移出屏幕,然后第二段动画文字layer从屏幕右侧边缘开始,一直移动到屏幕右侧边缘(只移动了一个屏幕的距离),然后接下来再次执行动画一,这样就实现了我要的效果。之前的实现方式是在第一段动画结束的时候,然后执行无限次执行第二次动画,但是这种方式当切换界面的会导致- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;被调用,动画就被停止了。于是只好利用CAAnimationGroup进行分段执行。
CAAnimationGroup是组合动画,我们可以给一个layer同时设置不同的动画一起执行,为了使动画一动画二能够分时执行,我们通过设置CABasicAnimation的beginTime来实现。例如第一段动画执行的时间为5s,第二段为3s,那么动画一的beginTime就设置为0,动画二的beginTime设