仿写思路:
1、无论单图还是九宫格,需要知道每一张图片是不是动图
2、在列表中需要知道,单个模块是否有动图需要播放
3、动图的播放、暂停、停止
仿写方法:
1、尝试了很多方法,去判断一个url是不是动图,但是效果都不是理想的,甚至不添加线程会出现阻塞主线程的现象,最终在SDWebImage中,发现加载图片中,会有一个回调,然后根据判断image的sd_isAnimated,得知是否是动图,如下图代码:
2、解决列表中,单个模块是否有动图,就根据scrollView的delegate,判断向上还是向下滑动,根据方法一做出的判断,找出合适的cell,然后暂停上一个gif,播放当前的gif
3、动图的暂停和播放,我尝试过拿到UIImageView的Layer,进行判断播放和暂停,在单图的情况下,效果还算可以,但是九宫格的时候,会出现不知道在什么时候播放下一张动图,即便是拿image的duration,然后增加一个NSTimer,还是不那么精确。在SDWebImage里面,存在一个SDAnimatedImageView,这是UIImageView的一个子类,里面有一个SDAnimatedImagePlayer,可以看到提供了方法有暂停播放,也提供了动图播放完一遍的回调,这样就完美解决,如下图代码:
特别提醒:一定要在遍历的时候,把gif进行禁止自动播放,否则会全部播放一遍gif,才会走写的逻辑。
//禁止自动播放,否则会导致全部gif自动播放一遍
cell.multiImageView.autoPlayAnimatedImage = NO;