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

2025-05-29 0 101

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

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

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

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

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
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)

}

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 IOS CoreAnimation中layer动画闪烁的解决方法 https://www.kuaiidc.com/93794.html

相关文章

发表评论
暂无评论