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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了故事板,UIImageView。从包中加载图像相关的知识,希望对你有一定的参考价值。

我的问题是:我有几个共享xcassets的项目/目标。我想要做的是在没有代码的情况下在storyboard中设置图像。

正如我所能找到的,没有办法在不同的捆绑中设置故事板中的图像。

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

是否存在一种在不同捆绑的故事板中使用资产的方法?

谢谢。

答案

所以,根据this question的答案,我知道一个解决方案。听起来你已经完成了一些,但只是为了给出一个完整的答案:

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

上面应该足以允许您在使用代码调用时使用框架资产目录中的图像...

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

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

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

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

enter image description here

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

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

老实说,如果这是一种最佳实践,我无法保证,但这是我发现实现我认为是减少项目之间重复的合理方法的唯一方法。如果您有兴趣,我发布了一个问题here来尝试确定这是否会导致构建中的资产重复。

以上是关于故事板,UIImageView。从包中加载图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IBDesignable UIImageView 在 prepareForInterfaceBuilder 中加载图像

从包中加载 NIB 时出现异常

在uiimageview中加载像gif这样的图像时出错

无法从包中加载 xib

在同一个 UIImageView 中加载多个图像会在显示新图像之前闪烁最后一个图像

UIImageView 和 UIButton 背景图像在模拟器中加载时变黑