美文网首页IOS开发资料库iOS 开发OC开发
SDWebImage图片下载完成后渐进显示动画

SDWebImage图片下载完成后渐进显示动画

作者: Kobe_Dai | 来源:发表于2017-02-12 22:44 被阅读1629次

    大部分APP在图片下载完成后都有一个渐进显示的动画,本文讲下在不动SDWebImage代码的前提下,怎么给下载完成后的图片加上渐进显示的动画,这是最终的效果:

    2017-02-12 22_53_44.gif

    一般情况下,我们都会写一个UIImageViewcategory来处理图片下载,代码如下:

    - (void)setWithImageURL:(NSString *)imageURL placeholder:(UIImage *)placeholder completion:(void (^)(UIImage *))completion
    {
            [self sd_setImageWithURL:[NSURL URLWithString:imageURL]
                    placeholderImage:placeholder
                           completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
                                   // handle downloaded image
                               }
                           }];
            
    }
    

    completed回调中,我们可以获取到下载完成的image,图片的缓存类型。回调完成后,不做任何处理的话,那么下载完的图片会直接加载到UIImageView上。这样对于用户来讲会比较生硬,给图片加上一个渐进显示的动画效果会好很多。

    要实现这个效果,我们会用到CATransition这个类,CATransitionCAAnimation的一个子类,CATransition的官方定义是An object that provides an animated transition between a layer's states. You can transition between a layer's states by creating and adding a CATransition object to it. 就是说我们可以通过CATransition来转换layer的状态,那么想实现渐进显示的动画效果,我们只需要加一个CATransitionUIImageView对象上。

    那么CATransition都有哪些transition的种类呢?看一下官方文档,总共有4种:

    • kCATransitionFade
    • kCATransitionMoveIn
    • kCATransitionPush
    • kCATransitionReveal

    第一种kCATransitionFade的解释是The layer’s content fades as it becomes visible or hidden.,看上去正是我们需要的transition type。通过一个CATransition使得图片加载由hidden变成visible状态时有一个渐进显示的动画效果。

    完整代码如下:

    [self sd_setImageWithURL:[NSURL URLWithString:imageURL]
            placeholderImage:placeholder
                   completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
                       if (image && cacheType == SDImageCacheTypeNone) {
                           CATransition *transition = [CATransition animation];
                           transition.type = kCATransitionFade;
                           transition.duration = 0.3;
                           transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
                           [weakself.layer addAnimation:transition forKey:nil];
                       }
                   }];
    

    转载请注明出处,原文地址:http://kobedai.me/p9rsts-5o/

    相关文章

      网友评论

      • EI_Rey:应用从后台回到前台,会再次加载渐变动画这个bug怎么解决?
        EI_Rey:@Kobe_Dai 哦,因为如果只有SDImageCacheTypeNone,那么只有第一次从网络上加载图片的时候才会有效果,本地有了缓存之后就再也不会看到效果了。我是想每次重新打开应用的时候都能看到效果,所以加了if(cacheType == SDImageCacheTypeNone|cacheType == SDImageCacheTypeDisk)但是如果应用从后台回到前台也会有动画
        Kobe_Dai:嗯?回到前台为什么还会再次加载动画?cacheType只有等于SDImageCacheTypeNone才会执行动画
      • PGOne爱吃饺子:楼主,你的这个block是不是写的有问题啊
      • WangRB:之前一直以为是用一层蒙板,在将要显示的时候设置动画 更改alpha值 :cold_sweat: 学习了
      • 笑天涯:帅气
      • GeekFounder:学习了

      本文标题:SDWebImage图片下载完成后渐进显示动画

      本文链接:https://www.haomeiwen.com/subject/mmfzittx.html