我的应用程序尺寸很大,因为它是通用的,专为Retina显示屏而设计。我想允许用户从我的服务器下载Retina图像,而不是最初将它们包含在应用程序中。
我尝试使用下面的代码。唯一的问题是图像存储在Documents文件夹中,应用程序不会将它们识别为Retina图像
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.test.com/img2@2x.png"]]];
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pngFilePath = [NSString stringWithFormat:@"%@/img2@2x.png",docDir];
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];
[data1 writeToFile:pngFilePath atomically:YES];
我应该如何保存图片以允许应用使用它们?
答案 0 :(得分:1)
它不起作用,因为UI图像的源是Bundle而不是NSDocumentDirectory文件夹。要使用视网膜和非视网膜图像,您应检测设备是否为视网膜,并以编程方式从NSDocumentDirectory加载图像。
您可以使用this进行视网膜检测。
答案 1 :(得分:1)
imageWithData:
方法将始终创建一个比例为1.0(非视网膜)的图像。从包外的自定义位置创建支持视网膜的UIImage,您需要使用initWithCGImage:scale:orientation:
方法:
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.test.com/img2@2x.png"]]];
UIImage *retinaImage = [UIImage initWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
(显然,你不应该同步下载图像......)。
我需要在上一个项目中做同样的事情(从文档目录中加载与比例相关的图像),所以我在UIImage类别中编写了一个小的便捷方法:
- (id)initWithContentsOfResolutionIndependentFile:(NSString *)path
{
if([[UIScreen mainScreen] scale] == 2.0) {
NSString *path2x = [[path stringByDeletingLastPathComponent]
stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.%@",
[[path lastPathComponent] stringByDeletingPathExtension],
[path pathExtension]]];
if([[NSFileManager defaultManager] fileExistsAtPath:path2x]) {
return [self initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:path2x]] CGImage] scale:2.0 orientation:UIImageOrientationUp];
}
}
return [self initWithContentsOfFile:path];
}
用法:
UIImage *myImage = [[UIImage alloc] initWithContentsOfResolutionIndependentFile:@"/path/to/image.png"];
这将尝试在视网膜上加载来自/path/to/image@2x.png
的图像,否则使用/path/to/image.png
。
答案 2 :(得分:0)
您可以使用[UIImage imageWithData: scale:]
并且可以跳过“@ 2x”命名约定:
- (UIImage *)getRetinaSafeImage: (NSString *)fileName
{
// alternatively you can use NSURL instead of path
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSData *myImageData = [NSData dataWithContentsOfFile: [NSString stringWithFormat:@"%@/%@",docDir, fileName]];
if([[UIScreen mainScreen] scale] == 2.0)
return [UIImage imageWithData:myImageData scale:2.0];
else return [UIImage imageWithData:myImageData];
}