我在我的应用程序中使用SDWebImage库进行图像缓存,但无法正确显示视网膜图像。
我知道有很多关于在github页面上下载视网膜图像的讨论,但是无法确定它是否已经完全解决并且没有任何“官方”的方法。
因为我的应用程序是通用的,所以我下载的每个图像都会有4种变体。这是一个例子:
下载这些图像的正确方法是什么,并让设备使用SDWebImage中正确的图像?
我尝试在我的iPhone 5上下载@ 2x-iphone.png图像,但它显示图像被炸毁并像素化,好像它不知道它是@ 2x图像。
使用多种设备类型处理视网膜图像的正确方法是什么?
答案 0 :(得分:4)
首先,原因 - UIImage不知道图像是视网膜图像还是常规图像。当您致电-[UIImage imageNamed:]
时,它会调用-[UIImage imageWithData:scale:]
并使用适当的比例值。
您的问题是由SDWebImage中的错误引起的。见source。如果它不存在,请继续file a bug。
问题是SDWebImage只查找@ 2x.png / jpeg文件名以确定它是否是视网膜图像。您可以继续修复该功能,以检查@ 2x~iphone.png / @ 2x~ipad.png文件名。
或者,如果您不想触摸SDWebImage代码,请在webImageManager:didFinishWithImage:forURL:userInfo:
回调中检查文件名是否为视网膜图像,如果是,请执行以下操作:
image = [UIImage imageWithCGImage: image.CGImage scale: [UIScreen mainScreen].scale]
答案 1 :(得分:0)
发现SDWebImage仅使用以下过滤器来确定图像是否是视网膜(位于SDWebImageCompat.m中):
NSRange range = [path rangeOfString:@"@2x." options:0 range:NSMakeRange(path.length - 8, 5)];
因为它只搜索“@ 2x”。 (注意句号)并且只有当它落在字符串的末尾时,所以像“my-image@2x~iphone.png”这样的图像不会被检测为视网膜。
更新了搜索整个图片网址“@ 2x”的代码。只关注这个问题是你不能在url中的任何其他地方使用“@ 2x”(但是开发人员曾经使用过那种命名约定?):
NSRange range = [path rangeOfString:@"@2x" options:0 range:NSMakeRange(0,path.length)];
我还在SDWebImage GitHub页面上提交了一个拉取请求(https://github.com/rs/SDWebImage/pull/370)