手机
当前位置:查字典教程网 >编程开发 >IOS开发 >IOS CoreAnimation中layer动画闪烁的解决方法
IOS CoreAnimation中layer动画闪烁的解决方法
摘要:网上有一段CoreAnimation层动画的例子,是将view中的云朵从左向右移动,直到移出屏幕,这时再将云朵移到最左端然后重复移动动画.所...

网上有一段Core Animation层动画的例子,是将view中的云朵从左向右移动,直到移出屏幕,这时再将云朵移到最左端然后重复移动动画.

所有动画在layer上完成,不过有个小问题,就是第一次每朵云动画完成时,会在其原位置处有一个闪烁,然后才会移动到屏幕最右端,而随后的运动动画都没有这个问题了:

IOS CoreAnimation中layer动画闪烁的解决方法1

由于录制gif文件时使用的帧率比较低,所以上图较难展示这个问题.不过实际App运行的时候每朵云在第一次移出屏幕的时候都会在初始位置闪烁一下再运行随后的动画.这是为什么呢?

因为layer动画不同于view层面上的动画,它实际不会修改原始view的任何属性.就拿云朵移动的动画来说,你虽然看上去改变了云朵的x坐标使其向右移动,可实际上原来的云朵ImageView根本还在原地,只不过CA用其外观创建了一个临时绘制进行移动,原来的云朵被暂时隐藏起来;一旦移动动画完成,该临时对象被删除,原来的云朵会在初始位置出现.

那么为什么只有动画第一次会出现闪烁呢?因为在第一次动画结束后,我在代码中修改了云朵view的x坐标,所以后面云朵的x坐标都和layer动画的fromValue相同,这将保证后续动画不会发生”闪烁”。

知道了原因,解决就很简单了,我只要在第一次动画前将云朵的x坐标修改为指定的位置,同时调整fromValue的值为初始位置即可:

func animateCloud(layer:CALayer){ let cloudSpeed = 15.0/Double(view.layer.frame.size.width) let duration:NSTimeInterval = Double(view.layer.frame.size.width - layer.frame.origin.x) * cloudSpeed //提前存储云朵layer的初始位置 let fromValue = layer.position //设置云朵的最终位置 layer.position.x = -layer.bounds.width/2 let cloudMove = CABasicAnimation(keyPath: "position.x") cloudMove.fillMode = kCAFillModeForwards //cloudMove.removedOnCompletion = false cloudMove.duration = duration //设置云朵的初始位置 cloudMove.fromValue = fromValue.x cloudMove.toValue = self.view.bounds.size.width + layer.bounds.width/2 cloudMove.delegate = self cloudMove.setValue("cloud", forKey: "name") cloudMove.setValue(layer, forKey: "layer") layer.addAnimation(cloudMove, forKey: nil) }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持查字典教程网。

【IOS CoreAnimation中layer动画闪烁的解决方法】相关文章:

比较IOS开发中常用视图的四种切换方式

iOS应用开发中对UIImage进行截取和缩放的方法详解

总结IOS界面间跳转的几种方法

objective-c中生成随机数的方法

Unity3d发布IOS9应用时出现中文乱码的解决方法

ios8 beta4微信闪退bug解决方法

详解iOS App中UIPickerView滚动选择栏的添加方法

ios下移动文件方法汇总

iOS10适配问题及解决方法 新鲜出炉!

举例讲解iOS应用开发中hitTest触摸事件的编写方法

精品推荐
分类导航