Go to file
Reda Lemeden 067cd58004 Cleanup SVG 2014-09-08 00:11:15 +02:00
Gifu.swift Convert constant to Int during declaration 2014-09-07 23:27:58 +02:00
ImageSourceHelpers.swift Initial commit 2014-09-06 16:12:09 +02:00
LICENSE Add LICENSE 2014-09-07 23:45:57 +02:00
README.md Add new line after logo in README 2014-09-07 23:48:09 +02:00
UIImageView+Gifu.swift Update animation API 2014-09-07 22:35:11 +02:00
figure.gif Update README 2014-09-07 23:45:51 +02:00
logo.svg Cleanup SVG 2014-09-08 00:11:15 +02:00

README.md

Adds animated GIF support to UIKit. For the Japanese prefecture, click here.

Why?

Because Apple's +animatedImage* sucks, and the few third party implementations that got it right (see Credits) still require you to use a UIImageView subclass.

How?

Gifu is a UIImage subclass and UIImageView extension written in Swift. It uses CADisplayLink to animate the view and only keeps a limited number of frames in-memory, which exponentially minimizes memory usage for large GIF files (+300 frames).

The figure below summarizes how this works in practice. Given an image containing 10 frames, Gifu will load the current frame (red), pre-load the next two frames (orange), and nullify all the other frames to free up memory (gray):

Usage

Use git submodules or drag-and-drop the files in your Xcode project. I can't believe I'm saying this in 2014.

Once done, you can call setAnimatableImage(named:) or setAnimatableImage(data:) on your UIImageView (or its subclass):

let imageView = UIImageView(...)

imageView.setAnimatableImage(named: "computer-kid.gif")
// or
imageView.setAnimatableImage(data: NSData(...))

To-do

The usual suspects:

  • Add documentation.
  • Write some basic tests.

Nice-to-haves:

  • Use Reactive Cocoa instead of (sloppy) delegation.
  • Remove side effects from the private functions.

Credits

  • The animation technique described above was originally spotted on OLImageView, then improved in YLGIFImage.

  • The font used in the logo is Azuki

  • Kudos to my colleague Tony DiPasquale for helping out with the factory methods.

License

See LICENSE.