iOS SDWebImage 加载完显示动画效果(渐进渐出)

前言

想必大部分的iOS开发加载图片一般都用的是SDWebImage,但是图片在download完之后的显示方式十分苍白。这边我给加载完图片加了个渐进渐出的动画。(现在大部分做的好一点的APP都有这样的效果)。


18.5.29更新

原来的写法是修改了SDWebImage的源码,这样的方式从本质上来说违反了软件开发的原则,而且每次pod install之后需要重新添加,非常麻烦。于是最近在新项目里使用的时候,改变了之前的方法。单独将效果提取出来新增了两个分类。

下面直接上代码:
引入"UIImageView+SDCategory.h"
以UIImageView为例(UIButton也是同样的效果)

-(void)sd_setFadeImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock
{
    __weak __typeof(self)wself = self;
    [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        if (image) {
            CATransition *animation = [CATransition animation];
            [animation setDuration:0.65f];
            [animation setType:kCATransitionFade];
            animation.removedOnCompletion = YES;
            [wself.layer addAnimation:animation forKey:@"transition"];
        }
        if (completedBlock) {
            completedBlock(image, error, cacheType, url);
        }
    }];
    [self.layer removeAnimationForKey:@"transition"];
} 

那么来分析一下代码:

1.这边我在自己建的category里调用了SD加载图片的方法;
2.在completed的block的返回值中判断image是否存在(这里解释下为什么要这么判断,因为image为nil的话,表示图片在缓存以及网络请求之后都没有获取到);
3.在判断Image存在之后,给self.layer(即当前的UIImageView添加了一个动画效果);
4.最后在block的外部移除动画,保证cell复用不会重复;

注意,不要给当前的UIImageView对象定义其他名为@"transition"的动画,会导致复用出错

以下是效果的动态图


iOS SDWebImage 加载完显示动画效果(渐进渐出)_第1张图片
testGif.gif

使用的文件在Class文件夹里,
希望对进来看的朋友有所帮助,如果有喜欢的可以给个Star或者是给个赞,谢谢~

下载地址

Demo地址,里面的SDWebImage可以拖出来使用~

你可能感兴趣的:(iOS SDWebImage 加载完显示动画效果(渐进渐出))