網上有一段Core Animation層動畫的例子,是將view中的雲朵從左向右挪動,直到移出屏幕,這時候再將雲朵移到最左端然後反復挪動動畫.
一切動畫在layer上完成,不外有個小成績,就是第一次每朵雲動畫完成時,會在其原地位處有一個閃耀,然後才會挪動到屏幕最右端,而隨後的活動動畫都沒有這個成績了:
因為錄制gif文件時應用的幀率比擬低,所以上圖較難展現這個成績.不外現實App運轉的時刻每朵雲在第一次移出屏幕的時刻都邑在初始地位閃耀一下再運轉隨後的動畫.這是為何呢?
由於layer動畫分歧於view層面上的動畫,它現實不會修正原始view的任何屬性.就拿雲朵挪動的動畫來講,你固然看上去轉變了雲朵的x坐標使其向右挪動,可現實上本來的雲朵ImageView基本還在原地,只不外CA用其外不雅創立了一個暫時繪制停止挪動,本來的雲朵被臨時隱蔽起來;一旦挪動動畫完成,該暫時對象被刪除,本來的雲朵會在初始地位湧現.
那末為何只要動畫第一次會湧現閃耀呢?由於在第一次動畫停止後,我在代碼中修正了雲朵view的x坐標,所今後面雲朵的x坐標都和layer動畫的fromValue雷同,這將包管後續動畫不會產生”閃耀”。
曉得了緣由,處理就很簡略了,我只需在第一次動畫前將雲朵的x坐標修正為指定的地位,同時調劑fromValue的值為初始地位便可:
func animateCloud(layer:CALayer){ let cloudSpeed = 15.0/Double(view.layer.frame.size.width) let duration:NSTimeInterval = Double(view.layer.frame.size.width - layer.frame.origin.x) * cloudSpeed //提早存儲雲朵layer的初始地位 let fromValue = layer.position //設置雲朵的終究地位 layer.position.x = -layer.bounds.width/2 let cloudMove = CABasicAnimation(keyPath: "position.x") cloudMove.fillMode = kCAFillModeForwards //cloudMove.removedOnCompletion = false cloudMove.duration = duration //設置雲朵的初始地位 cloudMove.fromValue = fromValue.x cloudMove.toValue = self.view.bounds.size.width + layer.bounds.width/2 cloudMove.delegate = self cloudMove.setValue("cloud", forKey: "name") cloudMove.setValue(layer, forKey: "layer") layer.addAnimation(cloudMove, forKey: nil) }
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐本站。
【IOS CoreAnimation中layer動畫閃耀的處理辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!