故事板、UIImageView。从包中加载图像

Sil*_*sya 5 bundle assets storyboard uiimageview ios

我的问题是:我有几个带有共享 xcassets 的项目/目标。我想做的是在故事板中设置图像而无需代码。

正如我发现的那样,无法在不同捆绑包的故事板中设置图像。

我创建了 UIImageView 扩展,但没有考虑最好的解决方案。

是否存在一种方法可以使用来自不同捆绑包的故事板中的资源?

谢谢。

The*_*eil 5

因此,根据这个问题的答案,我确实知道一个解决方案。听起来您已经完成了其中的一些操作,但只是为了给出完整的答案:

  1. 创建一个框架项目来存放共享图像(这也非常适合共享代码!):File > New > Project > iOS > Cocoa Touch Framework
  2. 在框架File > New > File > iOS > Resource > Asset Catalog中创建一个新的 Asset Catalog 。
  3. 将图像导入到资产目录中。
  4. 创建一个新工作区:文件 > 新建 > 工作区
  5. 将您的应用程序和框架添加到工作区:File > Add Files to WorkspaceName
  6. 将框架作为“嵌入式二进制文件”包含在应用程序的项目中:单击项目导航器中的蓝色项目文件图标,转到常规项目设置并找到嵌入式二进制文件。单击+并从列表中选择框架(例如ExampleFramework.framework)。

上面的内容应该足以让您在使用代码调用框架的资产目录中的图像时使用它们......

let frameworkBundle = Bundle(for: FrameWorkClass.self)
guard let image = UIImage(named: "MyImage", in: frameworkBundle, compatibileWith: nil) else { ... }
Run Code Online (Sandbox Code Playgroud)

...但是,要在故事板或 XIB中使用它,还需要一个步骤。虽然现在可以从 Interface Builder 中选择图像名称(甚至在选择时显示在此处),但故事板只能引用自己的包,因此当应用程序运行时,它会给出以下错误,并且图像将丢失:

无法加载从标识符为“BundleName”的包中的笔尖引用的“ImageName”图像

要解决此问题,您需要转到工作区的导航器(左侧面板)并将资产目录(即文件.xcassets)从框架拖动到应用程序项目本身内的某个位置(例如项目的根文件夹)。在出现的对话框中,确保您的应用程序在“添加到目标”列表中已选中,并且未选中以下选项。

在此输入图像描述

这将在应用程序的主包中创建对框架中资产目录的引用,但不会创建其副本。

完成此操作后,您可以使用该目录中的图像,就像故事板和 XIB 中的任何其他图像一样。

老实说,我不能保证这是否是最佳实践,但这是我发现的实现我也认为是最小化项目之间重复的明智方法的唯一方法。如果您感兴趣,我在这里发布了一个问题,尝试确定这是否会导致构建时资产重复。