Swift3 加载本地Gif 动画文件

注:用WebView可以加载Gif 但是会需要加载的时间比较长,所以用CAKeyframeAnimation 去加载Gif文件

//  首先先创建一个UIView的子类 GifView,里面代码如下
import UIKit
import ImageIO
import QuartzCore

typealias completionBlock = ()->()  // 动画完成后做的事情
class GifView: UIView, CAAnimationDelegate {
    
    private var gifurl: URL! // 把本地图片转化成URL
    private var imageArr: Array<CGImage> = [] // 图片数组(存放每一帧的图片)
    private var timeArr: Array<NSNumber> = [] // 时间数组 (存放每一帧的图片的时间)
    private var totalTime: Float = 0 // gif 动画时间
    private var completionClosure: completionBlock?
    
    /**
     *  加载本地GIF 图片
     */
    func showGIFImageWithLocalName(name: String, completionClosure:@escaping (()->())) {
        self.completionClosure = completionClosure
        self.gifurl = Bundle.main.url(forResource: name, withExtension: "gif")
        self.createKeyFram()
    }
    
    /**
     *  获取GIF 图片的每一帧有关的东西 比如:每一帧的图片、每一帧图片执行的时间
     */
    private func createKeyFram() {
        let url: CFURL = self.gifurl as CFURL
        let gifSource = CGImageSourceCreateWithURL(url, nil)
        let imageCount = CGImageSourceGetCount(gifSource!) // 总共图片张数
        
        for i in 0..<imageCount {
            let imageRef = CGImageSourceCreateImageAtIndex(gifSource!, i, nil) // 取得每一帧的图
            self.imageArr.append(imageRef!)
            
            let sourceDict = CGImageSourceCopyPropertiesAtIndex(gifSource!, i, nil) as NSDictionary!
            let gifDict = sourceDict![String(kCGImagePropertyGIFDictionary)] as! NSDictionary?
            let time = gifDict![String(kCGImagePropertyGIFUnclampedDelayTime)] as! NSNumber // 每一帧的动画时间
            self.timeArr.append(time)
            self.totalTime += time.floatValue
            
            // 获取图片的尺寸 (适应)
            let imageWidth = sourceDict![String(kCGImagePropertyPixelWidth)] as! NSNumber
            let imageHeight = sourceDict![String(kCGImagePropertyPixelHeight)] as! NSNumber
            
            if (imageWidth.floatValue / imageHeight.floatValue) != Float(self.width/self.height) {
                self.fitScale(imageWidth: CGFloat(imageWidth.floatValue), imageHeight: CGFloat(imageHeight.floatValue))
            }
        }
        
        self.showAnimation()
    }
    
    /**
     *  适应
     */
    private func fitScale(imageWidth: CGFloat, imageHeight: CGFloat) {
        var newWidth: CGFloat
        var newHeight: CGFloat
        if imageWidth/imageHeight > self.width/self.height {
            newWidth = self.width
            newHeight = self.width/(imageWidth/imageHeight)
        } else {
            newHeight = self.height
            newWidth = self.height/(imageHeight/imageWidth)
        }
        let point = self.center;
        
        self.frame.size = CGSize(width: newWidth, height: newHeight)
        self.center = point
    }
    
    /**
     *  展示动画
     */
    private func showAnimation() {
        let animation = CAKeyframeAnimation(keyPath: "contents")
        var current: Float = 0
        var timeKeys: Array<NSNumber> = []
        
        for time in timeArr {
            timeKeys.append(NSNumber(value: current/self.totalTime))
            current += time.floatValue
        }
        
        animation.keyTimes = timeKeys
        animation.delegate = self
        animation.values = self.imageArr
        animation.repeatCount = 1;
        animation.duration = TimeInterval(totalTime)
        animation.isRemovedOnCompletion = false
        self.layer.add(animation, forKey: "GifView")
    }
    
    // Delegate 动画结束
    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
        self.removeFromSuperview()
        if self.completionClosure != nil {
            self.completionClosure!()
        }
    }
}

之后再需要用动画的VC 里面 执行动画即可,代码如下

class TestViewController: UIViewControlelr {
override func viewDidLoad() {
        super.viewDidLoad()
        // 加载本地GIF 的View
        let gifView = GifView()
        gifView.frame = UIScreen.main.bounds
        gifView.showGIFImageWithLocalName(name: "bootPage", completionClosure: {
               // 做动画执行后的操作
        })
        self.view.addSubview(gifView)
   }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,658评论 4 59
  • 迷失在花乡茶谷 我执意来寻你, 或许在那个银装素裹的冬日, 早已定下心意。 在澄明如镜的湖边, 在轻嗅梅蕊时, 在...
    花熹cyp4290阅读 226评论 0 0
  • 我曾经有过一小包红色的种子。 它们红色和黑色相间。 那是我的大伯给我的。那个时候他说,这些种子会长出红色的叶子。 ...
    拿来下酒阅读 131评论 0 0
  • 去客户那里,客户正好在海边。雨天时海也是灰蒙蒙的,晴天时,海也蓝了起来。远远望去,真铁体会到海天一色的感觉,原先只...
    沐容心阅读 579评论 0 0