CABasicAnimation进入二级界面再回来不生效

2023-10-16 10:13:02 浏览数 (2)

背景

发现之前同事写的某个界面有个动效, 起初进入的时候是生效的, 进入二级界面再返回动效就没了, 动画用的是CABasicAnimation, 添加在 layer 上面.

解决

看代码没有问题, 毕竟第一次就生效了, 以为是在页面消失时做了什么操作, 查了之后发现, 页面消失时并没有操作.

再回过来看代码, 代码动画部分是在didMoveToWindow中实现的, 大致如下:

didMoveToWindow方法在页面消失和出现的时候都会调用, 难道是添加多次导致不生效了, 改成只添加一次之后发现效果一样, 进入二级页面再返回就不生效了.

代码语言:javascript复制

override func didMoveToWindow() {
     layer.addSublayer(gradientLayer)
     let basicAnim = CABasicAnimation(keyPath: "animateLocation")
     basicAnim.fromValue = [xxx]
     basicAnim.toValue = [xxx]
     basicAnim.duration = xxx
     basicAnim.repeatCount = Float.infinity
     gradientLayer.add(basicAnim, forKey: nil)
 }

回过头来再来看代码, 实现上没有什么问题, 除了最后一句key设置了为nil, 会不会是这个原因导致的?

设置forKey: "basicAnim", 再查看效果, 发现问题就解决了. 虽然查看文档, key确实可以设置为nil, 即使是我, 习惯上写的时候为了简单, 除非有多个动画的时候才给key赋值, 单个动画的时候就设置为forKey: nil. 果然出来混都是要还的…

最终的生效的大致代码如下:

代码语言:javascript复制
override func didMoveToWindow() {
        layer.addSublayer(gradientLayer)
        let basicAnim = CABasicAnimation(keyPath: "animateLocation")
        basicAnim.fromValue = [xxx]
        basicAnim.toValue = [xxx]
        basicAnim.duration = xxx
        basicAnim.repeatCount = Float.infinity
        gradientLayer.add(basicAnim, forKey: "basicAnim")
}

0 人点赞