背景#
发现之前同事写的某个界面有个动效,起初进入的时候是生效的,进入二级界面再返回动效就没了,动画用的是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")
}