2011-08-24 80 views
6

假设我有一个现有的iOS或Mac框架,我们将其称为Test.framework。这个框架已经成功地编译和链接了(一个技巧是为iOS部分的i386和armv6/7构建的),并且工作得很好。将图像(或其他资源)添加到Mac或iOS框架

现在我想为它添加一个图像,我们称之为'test.png'。我已经复制到我的框架的资源文件夹,使我有以下结构:

ls Test.framework 

- Headers -> Versions/Current/Headers 
- Resources -> Versions/Current/Resources 
- Test -> Versions/Current/Test 
- Versions 

ls Test.framework/Resources 

- Info.plist 
- test.png 

然而,当我用我的框架,创建一个项目,我不能访问图像。

我已经试过:

[UIImage imageNamed:@"test.png"] 
[UIImage imageNamed:@"Test.framework/test.png"] 
[UIImage imageNamed:@"Test.framework/Resources/test.png"] 

但没有摸索出总是给我回了nil对象。

任何想法?

编辑

经过一番深入调查,似乎什么,我试图完成,不能在iOS上进行。原因是最终的应用程序包(.app)不会复制为Mac OS编译的应用程序所在的私有框架。

这在iOS Bundle Structures documentation中进一步详述。

感谢Rob Keniger和xuzhe的感谢帮助。我将信誉xuzhe的答案,因为它实际上是我最初的问题最恰当的答案(即使罗布评论让我深入挖掘该问题)

回答

4

“imageNamed:”方法只适用于您的应用程序中的图像束。您应该使用

[[UIImage alloc] initWithContentsOfFile:path]; 

改为。

关于路径,因为我不确定“Test.Framework”是否在你的App bundle中,所以我不能给你一个示例代码。但如果剂量,下面的代码应该工作:

NSString* path = [Nsstring stringWithFormat:@"%@/Test.framework/Resources/test.png", [[NSBundle mainBundle] bundlePath]]; 
+0

说''imageNamed:“方法仅适用于您的应用程序包中的图像”并非完全正确。如果我添加一个包(比如test.bundle)到我的项目中,并且这个包中包含test.png,那么[UIImage imageNamed:@“test/test.png”]将很好地工作。 – apouche

+0

然而,你的解决方案很有趣,但我没有捆绑到我的应用程序中的框架(它可以安装在commond框架文件夹中) – apouche

+0

@apouche如果你正在应用程序包中添加一个包,然后调用'[UIImage imageNamed: @“test.bundle/test.png”];'没问题,因为test.bundle也在主包中。如果不是,我怀疑“imageNamed:”可以找到它。 – xuzhe

3

你可以捆绑使用[NSBundle bundleForClass:[SomeClass class]]特定类。您只需传入框架中定义的类,即可获得对框架包的引用。

然后,您可以使用NSBundle的方法向图像的路径请求捆绑包,然后使用NSImageinitWithContentsOfFile:方法创建图像。

请注意,您不应该硬编码路径。永远。获取资源路径有许多不同的功能和方法,您不需要对它们进行硬编码。

+1

这很聪明,但不幸的是它没有真正给出预期的结果。当我做了'[NSBundle bundleForClass:[SomeClass class]]'它给了我与主包完全相同的对象。原因是从我的Test.framework中使用的所有类都被添加到最终的项目二进制文件中,而不是“复制”到最终的.app路径中。所以最后资源被跳过:( – apouche

+0

感谢您的帮助,我想完成的任务不能在iOS上完成请参阅我的编辑如果您想了解更多信息 – apouche

相关问题