背景#
發現之前同事寫的某個界面有個動效,起初進入的時候是生效的,進入二級界面再返回動效就沒了,動畫用的是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")
}