最近有一个需求,在前后台切换的时候,会刷新tableView。由于SDWebImage在切换前后台的时候会清除memory的缓存,重新刷的时候会有图片闪动的问题。

整个解决历程是这样的:

contentSize和contentOffset的禁用

在iOS 11Self-Sizing自动打开后,contentSize和contentOffset都可能发生改变。
可以通过以下方式禁用

self.estimatedRowHeight = 0;self.estimatedSectionHeaderHeight = 0;self.estimatedSectionFooterHeight = 0;

然而这个方法并没有用,这个方法只会解决tableView整体的抖动,并不会解决图片的抖动问题。

UIView的隐式动画

接着又尝试了其他方法,由于UIView的隐式动画,也会造成图片的闪动问题。下面代码可以关闭隐式动画。

if (@available(iOS 11.0, *)) {[UIView setAnimationsEnabled:NO];[_tableView performBatchUpdates:^{[_tableView reloadData];} completion:^(BOOL finished) {[UIView setAnimationsEnabled:YES];}];
} else {[_tableView reloadData];
}

这个方法能解决闪动的问题,但是不能彻底解决闪动的问题,也会偶先闪动。

利用缓存解决

UIImage *cacheImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:url.absoluteString];
[_imageView sd_setImageWithURL:url placeholderImage:cacheImage?cacheImage:placeholderImage];

可以先从缓存中拿到图片,给sd的placeholderImage。这样,原本后台切前台的memory缓存被清理掉,在展示图片的时候先从disk读取(disk中的缓存不会被清理掉),再展示在imageView上。这样,就可以解决闪动的问题,达到预期的效果。
但是,这样做是有瑕疵的。由于[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:url.absoluteString]该方法是同步方法,没有在异步读取,所以会略微卡顿主线程,虽然这种卡顿不明显。

自定义imageView

终极解决方案:
我们会自定义imageView,在imageView中我们会实现cache,这种cache即使后台切前台也不会清除,并且这种cache是异步的,不会卡顿主线程。最终,这个方案完美的解决了这个问题。由于,代码实现稍微有点复杂,这里就不贴代码了。

解决一个问题都有一个过程,我们应该追求的是,不该在很浅的层面上解决问题而暴露其他问题,而是从根源入手,在实现机制上解决问题。

TableView图片闪动的问题相关推荐

  1. 【ElementUI】el-upload 到底该怎么使用?记录有时上传图片会失败,有时上传成功又出现图片闪动的问题

    ElementUI 官网 el-upload 组件使用:https://element.eleme.cn/#/zh-CN/component/upload 作为一个经常使用 ElementUI 的 C ...

  2. tableview 图片缓存

    需要对图片进行缓存 写入沙盒中,使用多线程下载图将队列放到字典中,value 线程 key 下载路径 判断是否有该key 没有创建添加一个线程下载 赋值图片只需刷新对应cell 就可以 @proper ...

  3. 封装:el-upload上传图片组件(解决图片闪动、多选问题)

    流程描述:使用el-upload组件,自定义上传方法(调后台接口),传图片file给后台,后台返回对应阿里云的oss链接,前端临时保存,最后点击页面提交按钮,再传后台oss数组链接. 项目遇到问题描述 ...

  4. java图片双缓存_Java 双缓冲技术消除图片闪动

    一般在使用Canvas组件刷新显示图片或者绘图的时候,会产生闪烁.这是由于机制是先使用背景色对原有内容进行覆盖,再往上面绘制新内容所引起的.我们看到的闪烁就是背景色和新内容之间的交替显示. 下面为Ca ...

  5. android图片闪动动画,android图片闪烁或帧动画

    remote_recording_transition.xml 文件 xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  6. Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件

    之前一直有关注过Jquery.LazyLoad.js这个特效,但一直没有用,这几天研究了一下,并应用于实际中,对网站SEO方面没有什么帮助,不过可以节省一些流量,对于大网站来说显的尤为重要,至于节省了 ...

  7. android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

    今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...

  8. 从“等等”到“秒开”再到“直开”,是什么让闲鱼社区相见恨晚?

    简介:快让我叉会儿腰- 作者:闲鱼技术-颂晨 背景 闲鱼前端页面的性能常常被人念叨,凡跳转.必跳鱼 的印象深入人心,部分页面甚至需要跳四五下才能打开,最近我们对闲鱼前端页面系统性的做了些优化,由于闲鱼 ...

  9. 微信小程序服务器域名修改生效时间,微信小程序修改request合法域名不生效及解决方法...

    界面设计技法之css布局 css布局之于页面就如同ECMAScript之于JS一般,细想一番,html就如同语文,css就如同数学,js呢,就是物理,有些扯远,这里就先不展开了. 回到主题,从最开始的 ...

  10. 如何用计算机制作动态图,电脑怎么制作动态图,如何制作动态壁纸

    如何制作动态图片 在线制作动态图片不完全教程,由动态图片基地[ASQQL.com]原创制作,如有疑问,请通过QQ方式与我们联系!联系方式见网站底部! 动态图片制作步骤分为以下几步: 第一步:上传视频或 ...

最新文章

  1. 大数据批量导入,解决办法,实践从定时从 sqlserver 批量同步数据到 mySql
  2. idea软件,如何不每次弹出“欢迎界面!”
  3. 在报文摘要算法MD5中,首先要进行明文分组与填充,其中分组时明文报文摘要按照(42)位分组。【答案】C
  4. docker安装gitlab_Gitlab 中 CI/CD 自动化部署与使用
  5. MyBatis使增删改不刷新二级缓存
  6. php 获取上周日期_php 获取今日、昨日、上周、本月的起始时间戳和结束时间
  7. linux 常用命令02--文件属性 以及软硬链接
  8. 生成注释_java基础- Java编程规范与注释
  9. 【Vue案例三】使用v-if指令 / component标签实现组件的切换
  10. sonar扫描android项目配置 mac版
  11. hive map 转string_Hive之SELECT语句的实用技巧 (一) | 每日五分钟学大数据
  12. pycharm-perl脚本
  13. 考研计算机网络复试题目整理
  14. Docker加速器配置
  15. Hot Observable 和 Cold Observable的区别
  16. 测试中的Right-BICEP
  17. X/Y/Z Modem、Kermit区别
  18. NJCTF writeup
  19. 杭电出了“王炸班”!考研3个清北8个浙大,就业人均起薪30万+
  20. 利用多线程实现电子时钟

热门文章

  1. 电脑误删分区如何恢复?图文详解
  2. gitlab 版本升级
  3. 入侵大型网站的完整思路
  4. html5背景泡泡,HTML5 canvas梦幻圆形泡泡动画背景特效
  5. 【常用办公软件】万彩办公大师教程丨全能图片转换工具
  6. 测量学7_地形图的基本知识
  7. 内网渗透系列:痕迹清理方法小结
  8. 关于百度导航SDK没声音的一种解决办法
  9. 现在大多数论文存在的弊病——可重复性
  10. 1 - 整洁代码 - 代码整洁之道