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


相关推荐: php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  教你用AI将一段旋律扩展成一首完整的曲子  如何用已有域名快速搭建网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  制作旅游网站html,怎样注册旅游网站?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  LinuxCD持续部署教程_自动发布与回滚机制  Laravel如何发送系统通知?(Notification渠道示例)  如何在阿里云香港服务器快速搭建网站?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何在自有机房高效搭建专业网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  Linux网络带宽限制_tc配置实践解析【教程】  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  linux写shell需要注意的问题(必看)  音响网站制作视频教程,隆霸音响官方网站?  网站制作免费,什么网站能看正片电影?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Android自定义listview布局实现上拉加载下拉刷新功能  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  jQuery 常见小例汇总  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  太平洋网站制作公司,网络用语太平洋是什么意思?  网站图片在线制作软件,怎么在图片上做链接?  网站建设保证美观性,需要考虑的几点问题!  如何基于PHP生成高效IDC网络公司建站源码?  LinuxShell函数封装方法_脚本复用设计思路【教程】  Python图片处理进阶教程_Pillow滤镜与图像增强  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何在建站之星绑定自定义域名?  C语言设计一个闪闪的圣诞树  常州企业网站制作公司,全国继续教育网怎么登录?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  如何快速生成高效建站系统源代码?  中山网站制作网页,中山新生登记系统登记流程?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何快速配置高效服务器建站软件?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Android利用动画实现背景逐渐变暗  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】