Swift Extension UIImage扩展支持加载GIF动画
·
一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。
效果

使用

import UIKit
import SnapKit
import Alamofire
class ViewController: UIViewController {
lazy private var imageView : UIImageView = {
let imageView = UIImageView()
return imageView
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
imageView.image = UIImage.gif(name: "nahuoLoading")
view.addSubview(imageView)
imageView.snp.makeConstraints { make in
make.width.height.equalTo(50)
make.center.equalToSuperview()
}
}
}
封装代码
import UIKit
import ImageIO
import MobileCoreServices
extension UIImage {
/// 根据本地 GIF 文件名生成动画 UIImage
/// - Parameter name: GIF 文件名(不带扩展名)
/// - Returns: 可选的 UIImage(animated)
static func gif(name: String) -> UIImage? {
guard let path = Bundle.main.path(forResource: name, ofType: "gif"), let gifData = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
return nil
}
return gif(data: gifData)
}
/// 根据 Data 生成动画 UIImage
/// - Parameter data: GIF 二进制数据
/// - Returns: 可选的 UIImage(animated)
static func gif(data: Data) -> UIImage? {
guard let source = CGImageSourceCreateWithData(data as CFData, nil) else {
print("Cannot create image source")
return nil
}
let count = CGImageSourceGetCount(source)
var images = [UIImage]()
var duration: TimeInterval = 0
for i in 0..<count {
if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
images.append(UIImage(cgImage: cgImage))
// 获取每帧持续时间
let properties = CGImageSourceCopyPropertiesAtIndex(source, i, nil) as Dictionary?
if let gifInfo = properties?[kCGImagePropertyGIFDictionary as String as NSObject] as? [String: Any] {
if let delayTime = gifInfo[kCGImagePropertyGIFUnclampedDelayTime as String] as? NSNumber {
duration += delayTime.doubleValue
} else if let delayTime = gifInfo[kCGImagePropertyGIFDelayTime as String] as? NSNumber {
duration += delayTime.doubleValue
}
}
}
}
if duration == 0 {
duration = Double(count) * 0.1
}
return UIImage.animatedImage(with: images, duration: duration)
}
}
更多推荐


所有评论(0)