開發(fā)中可能會遇到一系列圖片組成的動畫功能赦邻,圖片可能會達到幾十張甚至上百張炕倘,這時我們會用到序列幀的方法把這些圖片放到數(shù)組中隐孽,讓imageview的animation動畫去執(zhí)行。如:
self.imgView?.animationImages = imgArr //數(shù)組
self.imgView?.animationDuration = animateTime//動畫時間
self.imgView?.animationRepeatCount = repeatCount //是否重復
self.imgView?.startAnimating()
本地加載圖片的方式常用的有:
UIImage.init(named:"" )
UIImage.init(contentsOfFile: imagePath ?? "")
這兩種方式有什么不同呢躺坟?
1) imageNamed:
圖片是加載到緩存中的,即使指向他的指針被銷毀了乳蓄,內(nèi)存中依然會存在咪橙。好處是能快速加載該圖片,如果這個圖片經(jīng)常被用到建議此方法。
2) imageWithContentsOfFile:
圖片是不會緩存的美侦,如果指向他的指針被銷毀产舞,內(nèi)存也會被釋放。這個方法適合不經(jīng)常使用音榜,或者數(shù)量多的圖片庞瘸。序列幀的圖片非常適合使用這個方法。
現(xiàn)在通過下面這個例子來感受一下使用兩種方法內(nèi)存的變化赠叼。
- imageWithContentsOfFile方法
// MARK: ---- 動畫
func startAnimations(_ repeatCount:Int) {
var stringCount = ""
var imgArr = [UIImage]()
var imag:UIImage?
for index in 15..<107{
stringCount = index < 100 ? String(format: "000%d", index) : String(format: "00%d", index)
let imagePath = bundlePath.path(forResource: "load_\(stringCount)", ofType: "png")
imag = UIImage.init(contentsOfFile: imagePath ?? "")
imgArr.append(imag!)
}
self.beginAnimate(imgArr, TimeInterval(MagicView.Cookie_AnimationTime),repeatCount)
}
func beginAnimate(_ imgArr:Array<UIImage>,_ animateTime:TimeInterval,_ repeatCount:Int) {
self.imgView?.animationImages = imgArr
self.imgView?.animationDuration = animateTime
self.imgView?.animationRepeatCount = repeatCount
self.imgView?.startAnimating()
}
這個動畫是由90多張圖片組成擦囊,圖片一共有4M左右。
用真機跑的話動畫運行起來的時候
當點擊停止動畫時執(zhí)行:
//動畫結(jié)束
func mg_stopAnimation() {
self.imgView?.stopAnimating()
self.imgView?.animationImages = nil //這句話非常重要
}
- UIImage.init(named:"" )
如果用此方法 即使執(zhí)行動畫結(jié)束的方法內(nèi)存也不會被釋放嘴办。
demo