背景#
以前、同僚が書いたある画面に動きがあることに気づきました。最初に入ったときは効果がありましたが、二次画面に入って戻ると効果がなくなりました。アニメーションにはCABasicAnimation
が使用されており、レイヤーに追加されています。
解決#
コードを見ても問題はありません。最初は効果があったので、ページが消えるときに何か操作をしているのかと思い、調べたところ、ページが消えるときには操作がありませんでした。
再度コードを見直すと、アニメーション部分はdidMoveToWindow
で実装されており、大まかには以下のようになっています。
didMoveToWindow
メソッドはページが消えるときと現れるときに呼び出されます。もしかして、複数回追加したために効果がないのかと思い、1 回だけ追加するように変更したところ、効果は同じで、二次ページに入って戻ると効果がなくなりました。
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")
}