ios通过SDWebImage实现图片加载时的渐变效果

发布时间 - 2026-01-11 00:38:53    点击率:

先上效果图:

这些图片是在我限制了网速的情况下加载的:

实现效果

思路解析

想到渐变属性的时候,自然而然的想起CATransition这个类

先看整体的实现代码:

首先找到UIImageView+WebCache.m这个文件中的- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock这个函数(大约在44行处)

修改成这个样子

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock {
 [self sd_cancelCurrentImageLoad];
 objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

 if (!(options & SDWebImageDelayPlaceholder)) {
  dispatch_main_async_safe(^{
   self.image = placeholder;
  });
 }

 if (url) {

  // check if activityView is enabled or not
  if ([self showActivityIndicatorView]) {
   [self addActivityIndicator];
  }

  __weak __typeof(self)wself = self;
  id <SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
   [wself removeActivityIndicator];
   if (!wself) return;
   dispatch_main_sync_safe(^{
    if (!wself) return;
    if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock)
    {
     completedBlock(image, error, cacheType, url);
     return;
    }
    else if (image) {
     CATransition *animation = [CATransition animation];
     animation.duration = .85f;
     animation.type = kCATransitionFade;
     animation.removedOnCompletion = YES;
     [wself.layer addAnimation:animation forKey:@"transition"];
     wself.image = image;
     [wself setNeedsLayout];
    } else {
     if ((options & SDWebImageDelayPlaceholder)) {
      wself.image = placeholder;
      [wself setNeedsLayout];
     }
    }
    if (completedBlock && finished) {
     completedBlock(image, error, cacheType, url);
    }
   });
  }];
  [self.layer removeAnimationForKey:@"transition"];
  [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"];
 } else {
  dispatch_main_async_safe(^{
   [self removeActivityIndicator];
   if (completedBlock) {
    NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}];
    completedBlock(nil, error, SDImageCacheTypeNone, url);
   }
  });
 }
}

在大约30行处添加

     CATransition *animation = [CATransition animation];
     animation.duration = .85f;
     animation.type = kCATransitionFade;
     animation.removedOnCompletion = YES;
     [wself.layer addAnimation:animation forKey:@"transition"];

不需要过多解释kCATransitionFade意思是 交叉淡化过渡

这个 type 还有几个兄弟:

  1. kCATransitionFade  //交叉淡化过渡                    
  2. kCATransitionMoveIn  //移动覆盖原图                    
  3. kCATransitionPush  //新视图将旧视图推出去                    
  4. kCATransitionReveal  //底部显出来

因为我们的需求是渐变嘛,所以就使用kCATransitionFade

注意啦

一定要在下载图片的这个Block结束后,把animation去掉[self.layer removeAnimationForKey:@"transition"];

为什么呢,如果你不去掉,在cell复用的时候,会出现加载重复的情况呢。/坏笑 不信的话,你别加呀。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ios  # 图片加载渐变效果  # sdwebimage  # 渐变  # 加载图片  # iOS中实现imageView任意角度旋转的方法  # iOS开发之image图片压缩及压缩成指定大小的两种方法  # iOS如何固定UITableView中cell.imageView.image的图片大小  # IOS 中UIImageView响应点击事件  # IOS 出现错误reason: image not found的解决方案  # iOS开发image背景图片拉伸问题解决分析  # 加载  # 几个  # 在我  # 不需要  # 不信  # 什么呢  # 你别  # 自然而然  # 先看  # 大约在  # 大家多多  # 复用  # 如果你不  # 下载图片  # 情况下  # 结束后  # brush  # class  # objc_setAssociatedObject  # sd_cancelCurrentImageLoad 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何在服务器上配置二级域名建站?  公司门户网站制作流程,华为官网怎么做?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel中的withCount方法怎么高效统计关联模型数量  Linux系统运维自动化项目教程_Ansible批量管理实战  详解CentOS6.5 安装 MySQL5.1.71的方法  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  如何在搬瓦工VPS快速搭建网站?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么实现验证码(Captcha)功能  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  北京企业网站设计制作公司,北京铁路集团官方网站?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Swift中swift中的switch 语句  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何处理和验证JSON类型的数据库字段  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  在Oracle关闭情况下如何修改spfile的参数  桂林网站制作公司有哪些,桂林马拉松怎么报名?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  如何实现建站之星域名转发设置?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何打造高效商业网站?建站目的决定转化率  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  如何快速使用云服务器搭建个人网站?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  历史网站制作软件,华为如何找回被删除的网站?  怎样使用JSON进行数据交换_它有什么限制  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何在IIS7上新建站点并设置安全权限?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel如何升级到最新版本?(升级指南和步骤)  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何快速搭建支持数据库操作的智能建站平台?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  千库网官网入口推荐 千库网设计创意平台入口  EditPlus中的正则表达式 实战(1)  黑客入侵网站服务器的常见手法有哪些?  html如何与html链接_实现多个HTML页面互相链接【互相】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何快速选择适合个人网站的云服务器配置?