Closed make1a closed 8 months ago
准确的说我注释掉这个代码后,所有的图片都不会有闪的情况了,包括webP和非webP 都不再闪:
KingfisherManager.shared.defaultOptions += [
.processor(WebPProcessor.default),
.cacheSerializer(WebPSerializer.default)
]
所以我认为iOS13+iphone8 多次重复设置图片,会闪的问题来源于这里。
@yeatse
我做了一个可以重现的demo。 不停点击item 即可: https://github.com/onevcat/Kingfisher/files/13840999/LaunchAPP.zip
本地复现了一下 demo,设置 ImageCache.default.memoryStorage.config.totalCostLimit = 1
可以复现你的问题。
闪的原因是 reloadData
的时候触发 imageView.kf.setImage
,默认会把 UIImageView 当前内容置空,然后重新加载图片;
低端机内存不足,导致图片库跳过 memoryStorage
,重新从磁盘读取解析图片;又由于低端机性能不足,webp 解码较为耗时,在解码过程中 UIImageView 是空白状态,导致看上去“闪了一下”。
解法是增加 .keepCurrentImageWhileLoading
选项,让 imageView.kf.setImage
不再置空当前图片即可。
我测试过增加 .keepCurrentImageWhileLoading
,或者 设置placeholder = imageview.image
, 在重复刷新下还是会闪的很厉害。
同时还有一个问题 webP和非webP都会闪。
有其他解决方案吗?感激不尽
闪的原因我上面已经说过了,options 不生效的原因你可以按照这个思路断点查下;另外还有一个可能是你的 cell 没有复用,可以尝试定位下。
如果找不到原因的话尝试去 WebPSerializer 去掉试试,还是不行的话我也没办法了,直接别用 webp 了
最终只能在底层兼容两套图片库了, iOS13 走sdwebImage , iOS14 走kingfisher, 等项目升级到最低支持iOS14 再删掉SD。
https://github.com/onevcat/Kingfisher/issues/2188#issuecomment-1878283257