今是昨非

今是昨非

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

CABasicAnimationが二次画面に入った後、戻っても効果がない

背景#

以前、同僚が書いたある画面に動きがあることに気づきました。最初に入ったときは効果がありましたが、二次画面に入って戻ると効果がなくなりました。アニメーションには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)
    }

再度コードを見直すと、実装上は特に問題はありません。ただし、最後の行でkeynilに設定していることが原因かもしれません。

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

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。