iOS SDWebImage - 如何在不同设备上正确处理视网膜图像?

时间:2013-04-24 18:26:06

标签: ios retina-display ios-universal-app sdwebimage

我在我的应用程序中使用SDWebImage库进行图像缓存,但无法正确显示视网膜图像。

我知道有很多关于在github页面上下载视网膜图像的讨论,但是无法确定它是否已经完全解决并且没有任何“官方”的方法。

因为我的应用程序是通用的,所以我下载的每个图像都会有4种变体。这是一个例子:

下载这些图像的正确方法是什么,并让设备使用SDWebImage中正确的图像?

我尝试在我的iPhone 5上下载@ 2x-iphone.png图像,但它显示图像被炸毁并像素化,好像它不知道它是@ 2x图像。

使用多种设备类型处理视网膜图像的正确方法是什么?

2 个答案:

答案 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