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 】
相关推荐:
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中访问类常量与静态属性的优势【解答】
如何快速选择适合个人网站的云服务器配置?

