1

关于

我们的资产目录从 App 目标移动到 swift 包资源。Copy Bundle Resources之后,除非通过阶段复制资产目录(这意味着编译的应用程序中有 2 个副本),否则应用程序现有的故事板/xib 将无法再渲染这些资产。有没有更好的办法?

考虑迁移资产目录之前和之后的工作空间。

迁移 Assets.xcasset 之前

- FooApp/
  - FooApp/
    - Resources/
      - Assets.xcasset // #1.1 Standard asset catalog in app target
      - Assets.swift // internal scope access to images in Assets.xcasset (swiftgen)
    - ViewController/
      - MyViewController.swift
      - MyViewController.storyboard // #1.2 Contains a view which renders "imageA" from Assets.xcasset
    - View/
      - MyView.xib // #1.3 xib renders "imageB" from Assets.xcasset
      - MyUIKitView.swift // Programmatically renders "imageC" from Assets.xcasset
      - MySwiftUIView.swift // Programmatically renders "imageD" from Assets.xcasset

应用程序按预期工作。此处设置的典型资产目录。图像以多种方式使用:

  • 以编程方式(UIKit 和 SwiftUI)
  • 视觉上(xib 和故事板)

之后(将 Assets.xcassets 移至 MyPackage)

- FooApp/
  - FooApp/
    - Resources/
      - // #2.1 Assets.xcasset was relocated to MyPackage
    - ViewController/
      - MyViewController.swift
      - MyViewController.storyboard // #2.2 Contains a view which renders "imageA" from Assets.xcasset
    - View/
      - MyView.xib // Contains a subview which renders "imageB" from Assets.xcasset
      - MyUIKitView.swift // Programmatically renders "imageC" from Assets.xcasset
      - MySwiftUIView.swift // Programmatically renders "imageD" from Assets.xcasset
- MyPackage/
  - Package.swift // calls `.process("Resources/Assets.xcassets")`
  - Sources/
    - MyPackage/
      - Resources/
        - Assets.xcassets // Same asset catalog from #Before
        - Assets.swift // public scope access to images in Assets.xcasset (swiftgen)
  • 创建一个新的 swift 包 (MyPackage)
  • 移动到Assets.xcassets_Assets.swiftMyPackage
  • MyPackage/Package.swift, 调用.process("Resources/Assets.xcassets")
  • 将我们的程序化图像访问器更改为public范围

这是我们开始遇到问题的地方。

问题

  • [通过]MyPackage和应用程序都编译没有警告/错误。链接和启动就好了
  • [通过] 在运行时,任何对图像的编程引用都会按预期呈现。
  • [失败] 在运行时,任何呈现的 xib/storyboard 文件都无法渲染图像。
    • [注意] 如果我在 Xcode 中检查 xib/storyboard,图像会呈现。
    • [注意] 如果我单击图像(好像我要选择另一个),弹出列表会正确呈现Assets.xcassets.

因此,Xcode 对图像有足够的了解来渲染它们,并且可以在没有警告或错误的情况下进行编译,但是在运行时图像会丢失。

解决方案(有副作用)

在四处寻找之后,我找到了一个可行的解决方案(但我不满意):

在应用程序的构建阶段设置中,我添加了一个复制项目MyPackage/Sources/MyPackage/Resources/Assets.xcassets

再次编译/运行后,图像可以正确渲染为故事板/xibs。很好,但有一些不良副作用:

  1. 编译/链接的二进制文件包含两个Assets.xcassets. 一进MyPackage一出就是复制到App Bundle。
  2. 在 Xcode 中,Assets.xcassets在项目中出现两次。一个在MyPackage应用程序源的根目录中。在不中断复制阶段的情况下无法移动或隐藏它。它们至少是符号链接的,所以编辑就是编辑另一个。

备择方案?

是时候寻求帮助了。我认为这不是最好的/预期的方式。我已经用尽了我的 google-fu。在 Apple 的文档中找不到详细信息。

我想象有一种更自定义的方式来执行复制步骤(可能不包括 Package.swift 中的资产目录)?或者可能是在“构建规则”选项卡中编译资产目录的一种方式?

还是我做对了?

4

0 回答 0