5

i am currently working on a project which depends heavily on GIFs. However, I never worked with GIFs in Swift for iOS before an am pretty lost;)

The first thing I tried was to import some GIFs to my Assets.xcassets Folder. I realised that using an ImageSet for GIFs does not work.

So my first Question: How do I import GIFs into my project. And should I use only one resolution or are three the better way like for images?

Then I already checked out some Questions about presenting a GIF inside an UIImageView, programatically and via Storyboard. As I figured out this is probably best possible by using an Extension for UIImage Class. However, the Swift 4 Examples didn't work for me because of some reason;(

So my second Question: How do I use the imported GIFs inside my project and display them inside an UIImage View programatically?

Thanks a lot for your help guys in advance!

Saifan Nadaf
  • 1,715
  • 1
  • 17
  • 28
christophriepe
  • 1,157
  • 12
  • 47

4 Answers4

2

If your animated gif has a constant frame time for all frames then you can easily load it from your assets catalog without third party libraries with this:

extension UIImage {
    static func animatedGif(named: String, framesPerSecond: Double = 10) -> UIImage? {
        guard let asset = NSDataAsset(name: named) else { return nil }
        return animatedGif(from: asset.data, framesPerSecond: framesPerSecond)
    }

    static func animatedGif(from data: Data, framesPerSecond: Double = 10) -> UIImage? {
        guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return nil }
        let imageCount = CGImageSourceGetCount(source)
        var images: [UIImage] = []
        for i in 0 ..< imageCount {
            if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
                images.append(UIImage(cgImage: cgImage))
            }
        }
        return UIImage.animatedImage(with: images, duration: Double(images.count) / framesPerSecond)
    }
}
Leszek Szary
  • 9,763
  • 4
  • 55
  • 62
1

You have to manually decode GIF data, then you will be able to show it frame-by-frame. You will not have any simple answers here, bcs that's definitely very hard idea, try copy decoding algorithm from Third-Party and player or just use it. Something like SDWebImage will be the best option for you. Check SDAnimatedImagePlayer, SDWebAnimatedImage classes.

саня
  • 36
  • 2
0

I also had this kind of problem to solve. I found answers in this thread helpful. Please check them out. Add animated Gif image in Iphone UIImageView

Also, I highly recommend to checkout some implementations inside FLAnimatedImage. It handles showing, playing and other functionalities you might need for GIFs in iOS.

0

Use CGAnimateImageDataWithBlock or CGAnimateImageAtURLWithBlock after iOS 13.

extension UIImageView: SupportProduct {
    
    public func load(name: String, in bundle: Bundle = .main) {
        if let data = NSDataAsset(name: name, bundle: bundle)?.data {
            CGAnimateImageDataWithBlock(data as CFData, nil) { (_, cgImage, _) in
                self.image = UIImage(cgImage: cgImage)
            }
        }
    }
}
yycking
  • 1,017
  • 1
  • 9
  • 14