在UIImage imageNamed中使用外部图像

我正在从网上Apple.png和Apple@2x.png下载两张图片。 我想使用[UIImage imageNamed:@"Apple.png"]因此它可以使用内置function来检测它是否应该显示Apple.png或Apple@2x.png。

现在我在哪里存储这些图像? 我在文档中阅读了以下内容:

文件的名称。 如果这是第一次加载图像,则该方法在应用程序的主包中查找具有指定名称的图像。

啊所以应用程序的主要捆绑包是要走的路。 这就是我的代码:

 NSString *directory = [[NSBundle mainBundle] bundlePath]; NSString *path = [directory stringByAppendingPathComponent:imageName]; NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager createFileAtPath:path contents:dataFetcher.receivedData attributes:nil]; 

我检查了文件是否是在路径的文件夹中创建的,这是正确的。 我还在我的项目文件中拖了一个Example.png,看它是否存储在同一个文件夹中,这也是正确的。

但是, [UIImage imageNamed:@"Apple.png"]仍然无法获取图像。

你不能使用UIImage +imageNamed:方法与应用程序下载的图片。 该方法确实在应用程序包中查找图像,但是您的应用程序不允许在运行时更改自己的包。

将图像(当然是异步)下载到应用程序本地存储(即沙箱),并在本地引用它们。 然后,您可以使用NSDocumentDirectoryNSCachesDirectory始终获取对其位置的引用。

创建的文件是否具有适当的权限供您访问? 保存后你确定要关闭文件吗?

您无法在运行时修改捆绑包。 我还认为imageNamed使用的东西类似于在app中初始化的包含bundle资源引用的资源图。

试试这个: http : //atastypixel.com/blog/uiimage-resolution-independence-and-the-iphone-4s-retina-display/

再见!

我认为最好的解决方案是在Library文件夹中创建自己的包,例如images.bundle 。 在那里你可以为两种分辨率拍摄你的图像。 要访问这些图像,您可以使用NSTundle类的pathForResource:ofType:方法。 它返回适当的图像。 比返回路径的初始图像。

 NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error = nil; NSURL *libraryURL = [fileManager URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error]; if (libraryURL == nil) { ALog(@"Could not access Library directory\n%@", [error localizedDescription]); } else { NSURL *folderURL = [libraryURL URLByAppendingPathComponent:@"images.bundle"]; DLog(@"Future bundle url = %@",folderURL); if (![fileManager createDirectoryAtURL:folderURL withIntermediateDirectories:YES attributes:nil error:&error]) { ALog(@"Could not create directory %@\n%@", [folderURL path], [error localizedDescription]); } else{ NSBundle *bundle = [NSBundle bundleWithURL:folderURL]; // put image and image@2x to the bundle; [bundle pathForResource:yourImageName ofType:@"png"]; } } 

OP解决方案。

UIImage的分类:

 @implementation UIImage (ImageNamedExtension) + (UIImage *)imageNamed:(NSString *)name fromDirectory:(NSString *)directory { if ([UIScreen mainScreen].scale >= 3.0) { NSString *path3x = [directory stringByAppendingPathComponent:[[name stringByDeletingPathExtension] stringByAppendingFormat:@"@3x.%@", name.pathExtension]]; UIImage *image = [UIImage imageWithContentsOfFile:path3x]; if (image) { return image; } } if ([UIScreen mainScreen].scale >= 2.0) { NSString *path2x = [directory stringByAppendingPathComponent:[[name stringByDeletingPathExtension] stringByAppendingFormat:@"@2x.%@", name.pathExtension]]; UIImage *image = [UIImage imageWithContentsOfFile:path2x]; if (image) { return image; } } NSString *path = [directory stringByAppendingPathComponent:name]; return [UIImage imageWithContentsOfFile:path]; } @end