今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

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

背景#

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

解决#

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

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

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


   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. 果然出来混都是要还的...

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

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")
}

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。