From d1d641fdf78811264ed7e76ea88f2b31b024892d Mon Sep 17 00:00:00 2001 From: Reda Lemeden Date: Sun, 7 Sep 2014 23:45:51 +0200 Subject: [PATCH] Update README --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++-- figure.gif | Bin 0 -> 15659 bytes logo.svg | 10 +++++++++ 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 figure.gif create mode 100644 logo.svg diff --git a/README.md b/README.md index 9e64487..fd41e18 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,61 @@ -# Gifu + +Adds animated GIF support to UIKit. For the Japanese prefecture, click [here](https://goo.gl/maps/CCeAc). -Adds animated GIF support to UIImageView. +#### Why? +Because Apple's `+animatedImage*` sucks, and the few third party implementations that +got it right (see [Credits](#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): + +```swift +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](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. + +#### License + +See LICENSE. diff --git a/figure.gif b/figure.gif new file mode 100644 index 0000000000000000000000000000000000000000..28cbf19b2b0c596d187dc2d44c57a4838c3a99dc GIT binary patch literal 15659 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 ZXl6Z0&KnRc4;T=!%zBFQQGr3n{ttvRj;;Uz literal 0 HcmV?d00001 diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..7356fcc --- /dev/null +++ b/logo.svg @@ -0,0 +1,10 @@ + + + + logo + Created with Sketch. + + + + + \ No newline at end of file