将.xcassets文件添加到Xcode框架项目

7
我有一个使用多张图片的框架项目。目前,我只需将这些图像拖入项目中,以便它们与我的源文件并列:

enter image description here

当我将此项目嵌入到单独的应用程序项目中时,我可以按预期访问这些资源。

理想情况下,我现在想使用 .xcassets 文件组织我的框架图像。与 应用 项目不同,框架 项目模板默认不提供此功能,因此我使用 文件 > 新建 菜单手动添加了一个。不幸的是,当我重建框架并重新嵌入它时,我无法再访问这些图像。我正在尝试的操作是否可行?

2个回答

8

如果您想访问子项目(框架等)中的资源,则需要确保从其自己的捆绑包中收集它们,因为它们不是Main Bundle的一部分。

您可以使用以下这个简单的Swift 4代码:

let bundle = Bundle(for: type(of: self))
let image = UIImage(named: "imageName", in: bundle, compatibleWith: nil)

嗨Foti,你有什么建议如何在Storyboard或XIB中使用图像吗?当我尝试时,会出现错误:无法从标识符为"<BundleName>"的包中加载引用的"<ImageName>"图像 - TheNeil
1
@TheNeil Storyboards 仅能查看主束中的图像。如果您使用 CocoaPods,可以在您的 podspec 中使用 resources 并且您所有框架的资源最终都将包含在主束中: https://guides.cocoapods.org/syntax/podspec.html#tab_resources。另一种方法是创建一个 .bundle 文件与您的框架一起,但是您的框架的使用者需要手动.bundle 文件拖到他的项目中。 - Foti Dim

3
据我所了解,对于我的问题,答案是“是的,有点像……”
为了使用NSImage(named:...) API,必须满足以下两个条件之一:图像应该存在于应用程序的主要捆绑包中,或者(引用文档的话):

[应该有一个]使用setName:方法明确设置名称并当前驻留在图像缓存中的[NSImage]对象。

在图像驻留在嵌入式框架中的情况下,第一个条件不成立,因为框架是单独的捆绑包,并且无法在运行时添加到主要捆绑包。这只留下了第二种方法。
每当您的代码要使用NSImage(named:...)时,请确保已经使用其他方式加载了图像,然后设置其名称:
let bundle = NSBundle(forClass: MyFrameworkClass.self)
let image = bundle.imageForResource(name) // image in the framework .xcassets
image.setName(name)

我不知道这个有多大的用处,你应该注意文档中关于图像缓存操作的注释,但至少它是一种将图像存储在一个捆绑包的.xcassets文件夹中,然后从另一个地方访问它们的方法。


嗨,保罗。你有什么建议如何在Storyboard或XIB中使用图像吗?当我尝试时,会出现错误:无法从标识符为“<BundleName>”的包中加载引用的“<ImageName>”图像 - TheNeil
1
感谢提供这些信息。很遗憾苹果公司需要这样的变通方法,因为在可能的情况下应该鼓励资源的重复使用,但至少这是可以实现的。 - TheNeil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接