如何从NSBundle中的Assets.car(xcassets的编译版本)加载图像? (不使用CocoaPods)

时间:2014-04-04 17:49:35

标签: ios nsbundle xcasset

我们收到了这类错误消息:

无法加载" iconStatus"从包含标识符" com.company.OurResourceBundle"。

的包中的nib引用的图像

基本上,我们在xcassets文件夹中放置了一堆图像(适用于非捆绑加载的案例)。 xcassets和nib文件打包到资源包中。

当应用启动时,

  1. uibmageview在nib文件中无法加载任何带有上述错误消息的图像。
  2. [UIImage imageNamed:@" OurResourceBundle.bundle / iconStatus"]返回nil
  3. 问题与" How can I load an image from Assets.car (compiled version of xcassets) within an NSBundle?"有关,但我们不使用CocoaPod。

3 个答案:

答案 0 :(得分:8)

在iOS 7中,除了Xcode编译到主包中的文件之外,无法从任何.car文件加载图像。这是由Apple开发人员在https://devforums.apple.com/message/968859#968859确认的:​​

  

不幸的是,除了Xcode编译到主包中的图像之外,不可能从任何汽车文件加载图像,因为+ imageNamed:不接受bundle参数,这是需要这样做的(即使这样)它只能在一个包中打开一个资产目录。)

在iOS 8中,有一种新方法可以满足您的需求:

+ (UIImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle
    compatibleWithTraitCollection:(UITraitCollection *)traitCollection

答案 1 :(得分:0)

您必须定义包

partitioningColumns

答案 2 :(得分:-1)

我怀疑如果您的图片资源文件夹被压缩成.car文件,那么NSBundle将知道如何搜索其中的资产。尝试从资源包中创建新捆绑包。然后询问该图像路径的束。最后从该路径创建一个图像。这是我们将图像资源和本地化字符串与静态库捆绑在一起时采用的方法。我们的版本更加复杂,因为它会自动处理@ 2x和~ipr图像等事情,但这是它的要点。

    NSBundle *myBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"your bundle" ofType:@"bundle"]];
    NSString *filePath = [myBundle pathForResource:@"icon" ofType:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:filePath];