访问资产目录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。