我怎么能从一个NSBundle中的Assets.car(编译版本的xcassets)加载图像? (不使用CocoaPods)

我们正在收到这样的错误消息:

无法加载标识符为“com.company.OurResourceBundle”的包中的nib引用的“iconStatus”图像。

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

当应用程序启动时,

  1. 在nib文件中的uiimageview无法加载任何图像与上述错误信息。
  2. [UIImage imageNamed:@“OurResourceBundle.bundle / iconStatus”]返回nil

这个问题与“ 如何从一个NSBundle中的Assets.car(xcassets的编译版本)加载图像 ”有关,但我们不使用CocoaPods。

在iOS 7中,除了Xcode编译成主包之外,不能从任何.car文件加载图像。 苹果开发人员在https://devforums.apple.com/message/968859#968859确认了这一点:

不幸的是,除了Xcode编译成你的主包以外,不可能从任何汽车文件中载入图像,因为+ imageNamed:不接受bundle参数,这是必要的能够在一个包中打开一个资产目录)。

在iOS 8中,有一种新的方法可以做你想做的事情:

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

我怀疑如果您的图像资产文件夹被压缩到.car文件,然后NSBundle将知道如何search其中的资产。 尝试从您的资源包创build一个新的包。 然后问这个包的图像path。 最后从这个path创build一个图像。 这是我们将图像资源和本地化string与我们的静态库捆绑在一起时的方法。 我们的版本有一点涉及到,因为它会自动处理@ 2x和〜ipad图像,但这是它的要点。

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