日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS

發布時間:2025/3/12 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在制作一個應用程序,它在UIImageView中顯示gif,并從parse中加載gif。我偶然發現的問題是每當我加載一個Gif時,它會使用大約20 MB的內存,并且當我執行一個segue時,這個內存不會被分配。我從UIImageView中刪除圖像本身,但它仍然不釋放內存。顯示gif時出現巨大的內存使用Swift iOS

這是我用來顯示GIF代碼:

extension UIImage {

public class func gifWithData(data: NSData) -> UIImage? {

guard let source = CGImageSourceCreateWithData(data, nil) else {

print("SwiftGif: Source for the image does not exist")

return nil

}

return UIImage.animatedImageWithSource(source)

}

public class func gifWithName(name: String) -> UIImage? {

guard let bundleURL = NSBundle.mainBundle().URLForResource(name, withExtension: "gif") else {

print("SwiftGif: This image named \"\(name)\" does not exist")

return nil

}

guard let imageData = NSData(contentsOfURL: bundleURL) else {

print("SwiftGif: Cannot turn image named \"\(name)\" into NSData")

return nil

}

return gifWithData(imageData)

}

class func delayForImageAtIndex(index: Int, source: CGImageSource!) -> Double {

var delay = 0.1

// Get dictionaries

let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil)

let gifProperties: CFDictionaryRef = unsafeBitCast(

CFDictionaryGetValue(cfProperties,

unsafeAddressOf(kCGImagePropertyGIFDictionary)),

CFDictionary.self)

// Get delay time

var delayObject: AnyObject = unsafeBitCast(

CFDictionaryGetValue(gifProperties,

unsafeAddressOf(kCGImagePropertyGIFUnclampedDelayTime)),

AnyObject.self)

if delayObject.doubleValue == 0 {

delayObject = unsafeBitCast(CFDictionaryGetValue(gifProperties,

unsafeAddressOf(kCGImagePropertyGIFDelayTime)), AnyObject.self)

}

delay = delayObject as! Double

if delay < 0.1 {

delay = 0.1 // Make sure they're not too fast

}

return delay

}

class func gcdForPair(var a: Int?, var _ b: Int?) -> Int {

// Check if one of them is nil

if b == nil || a == nil {

if b != nil {

return b!

} else if a != nil {

return a!

} else {

return 0

}

}

// Swap for modulo

if a < b {

let c = a

a = b

b = c

}

// Get greatest common divisor

var rest: Int

while true {

rest = a! % b!

if rest == 0 {

return b! // Found it

} else {

a = b

b = rest

}

}

}

class func gcdForArray(array: Array) -> Int {

if array.isEmpty {

return 1

}

var gcd = array[0]

for val in array {

gcd = UIImage.gcdForPair(val, gcd)

}

return gcd

}

class func animatedImageWithSource(source: CGImageSource) -> UIImage? {

let count = CGImageSourceGetCount(source)

var images = [CGImageRef]()

var delays = [Int]()

// Fill arrays

for i in 0..

// Add image

if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {

images.append(image)

}

// At it's delay in cs

let delaySeconds = UIImage.delayForImageAtIndex(Int(i),

source: source)

delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms

}

// Calculate full duration

let duration: Int = {

var sum = 0

for val: Int in delays {

sum += val

}

return sum

}()

// Get frames

let gcd = gcdForArray(delays)

var frames = [UIImage]()

var frame: UIImage

var frameCount: Int

for i in 0..

frame = UIImage(CGImage: images[Int(i)])

frameCount = Int(delays[Int(i)]/gcd)

for _ in 0..

frames.append(frame)

}

}

// Heyhey

let animation = UIImage.animatedImageWithImages(frames,

duration: Double(duration)/1000.0)

return animation

}

class func FinalFrame(source: CGImageSource) -> UIImage? {

let count = CGImageSourceGetCount(source)

var images = [CGImageRef]()

var delays = [Int]()

var finalFrame = UIImage()

// Fill arrays

for i in 0..

// Add image

if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {

images.append(image)

}

// At it's delay in cs

let delaySeconds = UIImage.delayForImageAtIndex(Int(i),

source: source)

delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms

}

// Get frames

let gcd = gcdForArray(delays)

var frames = [UIImage]()

var frame: UIImage

var frameCount: Int

for i in 0..

frame = UIImage(CGImage: images[Int(i)])

frameCount = Int(delays[Int(i)]/gcd)

for _ in 0..

frames.append(frame)

}

}

finalFrame = frames[frames.count-1]

return finalFrame

}

}

難道這是原因,我得到的內存問題? 感謝任何幫助!

+0

兩者GIF和APNG可以以低存儲器請求數,像這樣進行處理:http://stackoverflow.com/a/25478854/763355 –

總結

以上是生活随笔為你收集整理的ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。