70

看起来:

[[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"];

但这些都不起作用。

有没有人成功检索到目录中资产的路径?

4

6 回答 6

27

同样的问题,但我认为我们不能通过 访问它pathForResource:,除了以下内容:

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

它已被清楚地记录在案

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

我发现在编译的应用程序包中,出现了一个名为“Assets.car”的文件,我认为这是我项目中的整个图像集,应该是压缩过的。

请参阅 Apple 的文档:

Xcode 5 根据项目的部署目标为资产目录提供不同的功能:

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

就是这样了。

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

于 2013-09-25T09:34:36.683 回答
12

我想访问一些矢量资产以UNNotificationAttachment使用本地资源进行创建,所以我想出了这个助手类。它基本上只是从资产中获取图像,将其数据保存到磁盘并返回文件 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
    }

}
于 2016-09-28T13:28:49.837 回答
11
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]];

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

于 2014-09-24T03:27:05.963 回答
2

尝试使用“编译资产目录”步骤中确定的图像名称。您将在构建输出中找到它。一定要扩展成绩单 - 你应该看到如下内容:

/* 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

使用+[UIImage imageNamed:]Xcode 6.1.1 测试。

于 2014-12-07T17:21:21.877 回答
0

特别是对于启动图像和应用程序图标,图像路径可分别通过 UILaunchImages 和 CFBundleIcons Info.plist 键获得。看起来这些图像是单独生成的,并且在使用资产目录时,在应用程序构建期间更新了 Info.plist 值(如果没有,这些键直接由 Xcode UI 写入)。您可能需要编写一些代码来确定要使用的正确子词典,但图像是单独可用的,在这种情况下您可以避免使用 imageNamed。

于 2015-04-01T16:41:55.403 回答
-3

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

使用一致的后缀命名每个文件,以匹配出现在 json 文件中的相应成语、比例和子类型。这需要通过为每个资产选择“在 Finder 中显示”选项并重命名每个文件来进行手动工作,但是一旦完成,您就可以将 pathForResource 与一个函数结合使用,将适当的后缀添加到基本资产名称以检索适当的 -大小的图像。

检索路径的示例代码:

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

“添加到购物车”图像资产的示例 Contents.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"
  }
}
于 2014-03-27T16:27:21.770 回答