无法使用 imageNamed 方法获取 UIImage 对象

Posted

技术标签:

【中文标题】无法使用 imageNamed 方法获取 UIImage 对象【英文标题】:Not able to get UIImage object using imageNamed method 【发布时间】:2009-01-20 13:51:35 【问题描述】:

我想从指定路径位置的 IImage 对象中获取图像。这里是代码。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  
                                                         NSUserDomainMask,   YES);

NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"image1.png"];
NSLog(writablePath);
UIImage *image=[UIImage imageNamed:writablePath];

我得到的图像对象为零。那么可能是什么问题? 我还确认 image1.png 存在于 writablePath 中。

【问题讨论】:

【参考方案1】:

我相信 UIImage imageNamed 从应用程序包中寻找图像,而不是通过完整路径。您可以使用 UIImage imageWithContentsOfFile 从完整路径加载(但它不会被缓存),或者只是将图像放入您的包中并使用 imageNamed。

您还需要检查该文件是否实际放置在您的应用程序包中,而不仅仅是位于您的项目目录中。

【讨论】:

你知道是否可以使用imageNamed:从缓存文件夹(NSCachesDirectory)加载图像时? 您应该使用 imagewithContentsOfFile 因为它不会将图像缓存在内存中。即使在替换或删除图像后,使用 imageNamed: 重复加载也会增加内存使用量。 @Javy,我不认为你的意思是说重复加载 same image with imageNamed: 会提高内存使用量,对吧?因为它毕竟是缓存的。 Upendra,我试图找到相同的答案 - 将所有图像都放在主目录中很烦人,但似乎没有办法 - imageNamed 总是在包根目录中查找 加载许多不同的图像会增加内存使用量。如果你在一个视图控制器中加载了 10 个图像,然后从另一个视图控制器加载了 10 个不同的图像,它们都会被缓存。如果您一遍又一遍地加载相同的图像,则 imageNamed 很有用。无论哪种方式,当内存用完时,缓存会清除未使用的图像数据,但我认为仅在经常重用同一图像时才缓存是一种好习惯。【参考方案2】:

您的问题的确切答案是您得到 nil,因为您使用的是 imageNamed:,它使用给定的(路径)名称 relative 到包根目录(即 . app 目录),而你给它一个 absolute 到文档目录的路径。

您实际上可以使用 imageNamed 从包的子目录中加载图像。 这需要两件事:

    您的图像实际上位于已部署包的子目录中,而不仅仅是 XCode 项目中的子目录或组 - 因为它们被折叠到根目录中。 换句话说,你需要 XCode 中的“蓝色组”(文件夹引用)。

    您在 imageNamed 中使用了相对路径。

所以 [UIImageView imageNamed:@"subdir/foo"] 将加载 foo.png 或 foo@2x.png,其中这些文件出现在 XCode 中名为“subdir”的“蓝色”组中。

您也可以使用它在文档的子目录中查找图像,因为您知道相对于您的包将在哪里创建文档,但这有点笨拙。要从文档中加载图像,您应该使用 imageWithContentsOfFile: 而不是 imageNamed:

我厌倦了寻找这种事情的答案并做了一些测试,并在回答这个问题时详细说明了这个和其他结果(带图片!):

UIImage imageNamed requires pathForResource?

【讨论】:

【参考方案3】:

我想用这个:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  
                                                         NSUserDomainMask,   YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"image1.png"];
NSLog(writablePath);

===上面写这个===

UIImage *image=[UIImage imageWithContentsOfFile:writablePath];

【讨论】:

以上是关于无法使用 imageNamed 方法获取 UIImage 对象的主要内容,如果未能解决你的问题,请参考以下文章

快速从 Url 获取 Imagename

iOS-iOS 获取蓝色文件夹图片

android以编程方式获取按钮背景imageName

swift一些常用系统方法的简化使用

ios8 UIImage imageNamed:崩溃

从变量设置图像名 - 目标c