背景
发现之前同事写的某个界面有个动效, 起初进入的时候是生效的, 进入二级界面再返回动效就没了, 动画用的是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
. 果然出来混都是要还的…
最终的生效的大致代码如下:
代码语言: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")
}