访问资产目录pathForResource

看起来:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png"];

不会为Images.xcassets资产目录中的资产返回任何内容。 我也试过:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images"];

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images.xcassets"];

但是这些都没有工作。

有没有人成功检索目录中资产的path?

同样的问题,但我不认为我们可以通过pathForResource:访问它,除下面:

 UIImage* image = [UIImage imageNamed:@"name-in-asset-catalog"]; 

已经有清楚的logging :

资产目录中的每个集合都有一个名称。 您可以使用该名称以编程方式加载集合中包含的任何单个图像。 要加载图像,请调用UIImage:imageNamed:方法,传递包含图像的集合的名称。

我发现,在complied应用程序包,一个名为“Assets.car”的文件出来了,我认为这是我的项目中的整个图像集,应该已经压缩或什么的。

请参阅Apple的文档:

Xcode 5为资产目录提供了不同的function,具体取决于项目的部署目标:

  • 对于所有项目,可以使用设置名称加载单个图像。
  • 对于具有iOS 7部署目标的项目,Xcode会将您的资产目录编译为运行时二进制文件格式,从而缩短您的应用程序的下载时间。

就是这样了。

我也在寻找一种不使用imageNamed: ,我不希望运行时caching我的图像。

 [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]]; 

imgName:图片集的名称,不关心图片集中图片的真实名称。

我想访问一些vector资源来创buildUNNotificationAttachment与本地资源,所以我想出了这个助手类。 它基本上只是从资产获取图像,将其数据保存到磁盘并返回文件的URL。 我希望能帮助别人。

 import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: String) -> URL? { let fileManager = FileManager.default let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] let url = cacheDirectory.appendingPathComponent("\(name).png") guard fileManager.fileExists(atPath: url.path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFile(atPath: url.path, contents: data, attributes: nil) return url } return url } } 

尝试使用“编译资产目录”步骤中确定的图像名称。 你会在构build输出中find它。 一定要扩大成绩单 – 你应该看到这样的事情:

 /* com.apple.actool.compilation-results */ /path/to/Debug-iphonesimulator/Your.app/LaunchImage-800-Portrait-736h@3x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-800-667h@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-568h@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape@2x~ipad.png 

使用Xcode 6.1.1使用+[UIImage imageNamed:]进行testing。

虽然有一个Contents.json文件(见下文)与xcassets中的每个项目关联,其中包含该项目的图像的文件名,但它似乎不能在文件系统级访问。 所有图像在编译时都放在一个文件系统文件夹中。 json文件是自动生成的,不应该被编辑,但它提供了一个解决方法的模板。

用一致的后缀命名每个文件,以匹配出现在json文件中的相应成语,缩放和子types。 这需要通过为每个资源select“Show in Finder”选项并重命名每个文件来进行手动工作,但是一旦完成,您就可以使用pathForResource和一个函数结合使用,将适当的后缀添加到基础资产名称中,大小的图像。

示例代码来检索path:

 NSString *imageName = @"Add to Cart"; NSString *imageSuffix = [self someMethodThatDeterminesSuffix]; // Example: "-iphone-2x-retina4" NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%@", imageName, imageSuffix] ofType:@"png"]; 

示例Content.json文件的“添加到购物车”图像资产:

 { "images" : [ { "idiom" : "iphone", "scale" : "1x", "filename" : "Add to Cart-iphone-1x.png" }, { "idiom" : "iphone", "scale" : "2x", "filename" : "Add to Cart-iphone-2x.png" }, { "idiom" : "iphone", "filename" : "Add to Cart-iphone-2x-retina4.png", "subtype" : "retina4", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } 

对于启动图像和应用程序图标,图像path分别通过UILaunchImages和CFBundleIcons Info.plist键可用。 看起来,这些图像是单独生成的,并且在使用资产目录时(如果不是,这些密钥直接由Xcode UI写入),应用程序生成过程中会更新Info.plist值。 您可能需要编写一些代码才能找出正确的子字典,但是这些图像可以单独使用,您可以避免在这种情况下使用imageNamed。