Storyboard,UIImageView。从捆绑包中加载图像

4
我的问题是: 我有几个使用共享xcassets的项目/目标。 我想要做的是在没有代码的情况下设置故事板内的图像。
据我所知,没有办法从不同的bundle中设置storyboard中的图像。
我创建了UIImageView扩展,但不认为这是最好的解决方案。
是否存在一种方法可以从不同的bundle中在storyboard中使用assets?
谢谢。

https://dev59.com/2mox5IYBdhLWcg3wHAsA#9425834 - Adrian
@Adrian,所以,没有办法在单个工作区内共享资源吗?(只是确认一下) - Silin Vasya
我不是100%确定,但从安全角度来看,我认为苹果不希望你通过其他应用程序获取资源。 - Adrian
@Adrian,这是100%正确的。但区别在于我想在单个工作区中在我的xcode项目之间共享资源。 - Silin Vasya
1个回答

4
基于对这个问题的回答,我知道一种解决方案。听起来你已经完成了其中一部分,但为了给出完整的答案,以下是具体步骤:
  1. 创建一个框架项目以存放共享图像(还非常适用于共享代码): 文件 > 新建 > 项目 > iOS > Cocoa Touch 框架
  2. 在框架中创建新的资源目录文件 > 新建 > 文件 > iOS > 资源 > 资源目录
  3. 将您的图像导入到资源目录中。
  4. 创建一个新的工作区:文件 > 新建 > 工作区
  5. 将您的应用程序和框架都添加到工作区:文件 > 将文件添加到工作区名称
  6. 在应用程序项目中将框架作为“嵌入式二进制文件”包括进去:单击项目导航器中的蓝色项目文件图标,转到常规项目设置并定位嵌入式二进制文件。单击+并从列表中选择框架(例如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

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

完成后,您可以像其他资源一样在您的故事板和XIB中使用该目录中的图像。

老实说,我不能保证这是最佳实践,但这是我发现的实现最小化项目之间重复的合理方法。如果你感兴趣,这里有一个问题here,试图确定这是否会在构建时导致任何资源的副本。


我在一个项目中有多个目标,需要在“Target Membership”下将.xcassets文件添加到两个应用程序目标中,以便能够在我的应用程序目标中看到框架资源,而不是在项目之间拖动xcassets。您在这里的解释给了我提示,谢谢。 - Robert Atkins
1
这种方法的问题在于它会在所有链接的框架中复制资产。如果您检查最终构建的应用程序,在您执行此操作的每个框架内,您将看到相同的资产,从而增加了最终应用程序的大小。如果您有一个小目录和不多的模块,它可能有效,但对于大型资产或许多模块则不适用。 - Angel G. Olloqui

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