基于对
这个问题的回答,我知道一种解决方案。听起来你已经完成了其中一部分,但为了给出完整的答案,以下是具体步骤:
- 创建一个框架项目以存放共享图像(还非常适用于共享代码): 文件 > 新建 > 项目 > iOS > Cocoa Touch 框架。
- 在框架中创建新的资源目录文件 > 新建 > 文件 > iOS > 资源 > 资源目录。
- 将您的图像导入到资源目录中。
- 创建一个新的工作区:文件 > 新建 > 工作区。
- 将您的应用程序和框架都添加到工作区:文件 > 将文件添加到工作区名称。
- 在应用程序项目中将框架作为“嵌入式二进制文件”包括进去:单击项目导航器中的蓝色项目文件图标,转到常规项目设置并定位嵌入式二进制文件。单击+并从列表中选择框架(例如ExampleFramework.framework)。
以上步骤足以让您在使用代码调用时从框架的资源目录中使用图像。
let frameworkBundle = Bundle(for: FrameWorkClass.self)
guard let image = UIImage(named: "MyImage", in: frameworkBundle, compatibileWith: nil) else { ... }
但是,如果要在Storyboard或XIB中使用它,则需要再进行一步操作。虽然现在可以从Interface Builder中选择图像名称(并且在选择时甚至会显示出来),但故事板只能引用自己的包,因此应用程序运行时将会出现以下错误,并且图像将会消失:
无法加载“ImageName”图像,该图像被引用自“BundleName”标识符下的nib文件
为了解决这个问题,您需要进入工作区的导航器(左面板),将资源目录(i.e. .xcassets
文件)从框架拖到应用程序项目本身的某个位置(例如,项目的根文件夹)。
在出现的对话框中,确保你的应用程序已经在 Add to targets 列表中选中,并且你保留以下选项的未选中状态。
![enter image description here](https://istack.dev59.com/TZgDR.webp)
这将在您的应用程序主包中创建一个对框架中的资源目录的引用,但不会创建副本。
完成后,您可以像其他资源一样在您的故事板和XIB中使用该目录中的图像。
老实说,我不能保证这是最佳实践,但这是我发现的实现最小化项目之间重复的合理方法。如果你感兴趣,这里有一个问题here,试图确定这是否会在构建时导致任何资源的副本。