访问资产目录pathForResource


69

看起来:

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

但是这些都不起作用。

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


6
有同样的问题!
vilanovi

我还需要图像的实际路径,因为我不想使用imageNamed(中断的缓存),结果是资产目录也被破坏,没有程序访问权限。
Alper 2014年

@MobileVet您是否找到了解决方案?
Keab42

@ Keab42不,我刚遇到另一个我想要的情况!:)
MobileVet

Answers:


26

同样的问题,但我认为我们不能通过进行访问pathForResource:,以下除外:

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

已明确记录

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

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

请参阅Apple的文档:

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

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

就是这样了。

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


4
我在此处将图像缓存存在相同的问题stackoverflow.com/questions/19919113/…。它看起来像imageNamed:使用Asset Catalogs时,缓存无法按预期方式工作,因为系统从未释放过内存,甚至没有出现内存警告。
knl

6
我可以验证一下。内存未释放。iOS的这一部分非常糟糕。
Alper 2014年

如果资产中有一个文件夹并且我只需要该文件夹中的照片怎么办?有什么帮助吗?
Yucel Bayram

这里同样的问题。iOS的11 ..的XCode 9.1
gaskbr

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
    }

}

1
我遇到了同样的问题,并且效果很好。感谢分享。
RommelTJ

真好!我在UIImage类上将其设为静态函数。
乔恩·沃格尔

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

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


1
除主捆绑包外,其他捆绑包中的图像均不起作用。
user1010819 2014年

谢了哥们。这样做的方式可以很好地替代+(UIImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundantcompatibleWithTraitCollection:(UITraitCollection *)traitCollection。它是在iOS 8.0中引入的,我也需要介绍7.xx。
亚瑟·格沃基安

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进行了测试。


0

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


-2

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

用一致的后缀命名每个文件,以匹配json文件中出现的相应惯用法,小数位数和子类型。这需要通过为每个资产选择“在查找器中显示”选项并重命名每个文件来进行手动操作,但是一旦完成,您就可以将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"
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.