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 还有几个兄弟:
- kCATransitionFade //交叉淡化过渡
- kCATransitionMoveIn //移动覆盖原图
- kCATransitionPush //新视图将旧视图推出去
- 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数据解析【详解】

