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