【问题标题】:Storyboard, UIImageView. Load image from bundle故事板,UIImageView。从包中加载图像
【发布时间】:2017-05-05 20:27:40
【问题描述】:

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

据我所知,无法在不同包的情节提要中设置图像。

我创建了 UIImageView 扩展,但不认为是最好的解决方案。

有没有一种方法可以使用来自不同捆绑包的故事板中的资产?

谢谢。

【问题讨论】:

  • @Adrian,所以,即使在单个工作空间内也无法共享资源? (只是为了确认)
  • 我不能 100% 确定,但从安全的角度来看,我认为 Apple 不希望您使用其他应用程序获取资源。
  • @Adrian,这是 100% 正确的。但不同的是,我想在单个工作区中的 xcodeprojects 之间共享资源。

标签: ios uiimageview storyboard bundle assets


【解决方案1】:

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

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

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

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

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

无法加载从 nib 中引用的“ImageName”图像 带有标识符“BundleName”的捆绑

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

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

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

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

【讨论】:

  • 我在一个项目中有多个目标,我需要将“Target Membership”下的 .xcassets 文件添加到两个应用目标中,以便能够在我的应用目标中看到框架资产,而不是拖动项目之间的 xcassets。不过,您在这里的解释给了我提示,谢谢。
  • 这种方法的问题是它会复制所有链接框架中的资产。如果您检查最终构建的应用程序,在您执行此操作的每个框架内,您将看到相同的资产,从而增加最终应用程序的大小。如果您的目录很小且模块不多,它可能会起作用,但不适用于大型资产或许多模块。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2012-08-12
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多