今是昨非

今是昨非

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

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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。