2014-09-07 22:39:40 +00:00
< img src = "https://dl.dropboxusercontent.com/u/148921/assets/logo.svg" width = "100" / >
2014-09-07 21:48:09 +00:00
2014-09-17 10:47:45 +00:00
Adds performant animated GIF support to UIKit, without subclassing `UIImagevIew` . For the Japanese prefecture, click [here ](https://goo.gl/maps/CCeAc ).
2014-09-06 14:17:20 +00:00
2014-09-07 21:45:51 +00:00
#### Why?
2014-09-07 22:36:05 +00:00
2014-09-17 10:47:45 +00:00
Because Apple's `+animatedImage*` is not meant to be used for animated GIFs (loads all the frames in memory), and the few third party implementations that got it right (see [Credits ](#credits )) still require you to use a `UIImageView` subclass, which is not very flexible and might clash with other application-specific functionality.
2014-09-07 21:45:51 +00:00
#### 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
2014-09-08 09:24:50 +00:00
containing 10 frames, Gifu will load the current frame (red), pre-load the next two frames in this example (orange),
2014-09-07 21:45:51 +00:00
and nullify all the other frames to free up memory (gray):
2014-09-07 22:36:05 +00:00
< img src = "https://raw.githubusercontent.com/kaishin/gifu/master/figure.gif" width = "300" / >
2014-09-07 21:45:51 +00:00
#### 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):
```swift
let imageView = UIImageView(...)
imageView.setAnimatableImage(named: "computer-kid.gif")
2014-09-11 21:26:38 +00:00
// imageView.setAnimatableImage(data: NSData(...))
2014-09-07 21:45:51 +00:00
```
2014-09-11 21:26:38 +00:00
The image view will not start animating until you call `startAnimating()`
on it. You can stop the animation anytime using `stopAnimating()` , and resume
it using `startAnimating()` .
2014-09-07 22:48:47 +00:00
2014-09-11 21:26:38 +00:00
The `isAnimating()` method returns the current animation state of the view.
For an example, check out the demo app [here ](https://github.com/kaishin/gifu/tree/demo ) (requires Xcode 6).
2014-09-10 19:36:06 +00:00
< img src = "https://raw.githubusercontent.com/kaishin/gifu/demo/demo.gif" width = "300" / >
2014-09-07 22:48:47 +00:00
#### Compatibility
- iOS 7+
2014-09-07 22:36:05 +00:00
2014-09-10 19:36:06 +00:00
#### Roadmap
2014-09-07 21:45:51 +00:00
The usual suspects:
- Add documentation.
- Write some basic tests.
2014-09-10 19:36:06 +00:00
Needless to say, you are welcome to contribute.
2014-09-07 21:45:51 +00:00
#### Credits
- The animation technique described above was originally spotted on
[OLImageView ](https://github.com/ondalabs/OLImageView ), then improved in [YLGIFImage ](https://github.com/liyong03/YLGIFImage ).
- The font used in the logo is [Azuki ](http://www.myfonts.com/fonts/bluevinyl/azuki/ )
- Kudos to my colleague [Tony DiPasquale ](https://github.com/tonyd256 ) for helping out with the factory methods.
2014-09-10 19:41:13 +00:00
- The characters used in the icon and example image in the demo are from [Samurai Champloo ](https://en.wikipedia.org/wiki/Samurai_Champloo ).
2014-09-10 19:44:28 +00:00
2014-09-07 21:45:51 +00:00
#### License
See LICENSE.