Gif动画

        Appkit自带的NSImageView可以自动解析gif文件,根据gif文件关键帧生成动画。只要设置属性animates为YES时,就开启了动画动能。但是当父类View或自身开启layer-backed功能时,gif动画功能就不起作用了。

        其实解决这种问题,有多种方式吧。一种为子类化NSImageView,重写wantsUpdateLayer并返回YES。另外一种方式,就是自己解析gif文件,使用定时器,循环绘制各帧。

        本文打算使用第二种方式。思路大概如下:

1.使用NSImage加载gif文件。


2.从NSImage里获取实际表达图片数据的NSImageRep (NSImage其实类似于容器,NSImageRep才是正宗的跟图片数据相关的一种表达方式,对这一部分的理解,完全是个人观点,不知道理解的对不对)。


将NSImageRep类型转换成我们需要的类型NSBitmapImageRep,NSBitmapImageRep里面,我们感兴趣的属性包括NSImageFrameCount、NSImageCurrentFrame和NSImageCurrentFrameDuration。

各字段意义如下:
NSImageFrameCount:通过该字段,可以设置或获取gif图片总共多少帧动画。
NSImageCurrentFrame:通过该字段,可以设置或获取当前对应哪一个帧(值 <= 总帧数 - 1 )。
NSImageCurrentFrameDuration:通过该字段,可以设置或获取当前该帧动画的时间周期。


3.通过NSImageCurrentFrameDuration字段获取某一帧(当前帧为第0帧)的动画时间周期delaytime,开个定时间,每隔delaytime时间,我们重绘制一次,设置绘制的当前帧为下一帧(这里面做了一个简化处理,默认各帧动画时间意义,考虑到不一样的情况,请参考大神keefo写的代码:[https://github.com/keefo/gifdemo](https://github.com/keefo/gifdemo)),如此反复。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后附上demo(osx下oc与swift版本):[https://github.com/FyhSky/GifView_OC_Swift](https://github.com/FyhSky/GifView_OC_Swift)