关于
我们的资产目录从 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.swift
MyPackage
- 在
MyPackage/Package.swift
, 调用.process("Resources/Assets.xcassets")
- 将我们的程序化图像访问器更改为
public
范围
这是我们开始遇到问题的地方。
问题
- [通过]
MyPackage
和应用程序都编译没有警告/错误。链接和启动就好了 - [通过] 在运行时,任何对图像的编程引用都会按预期呈现。
- [失败] 在运行时,任何呈现的 xib/storyboard 文件都无法渲染图像。
- [注意] 如果我在 Xcode 中检查 xib/storyboard,图像会呈现。
- [注意] 如果我单击图像(好像我要选择另一个),弹出列表会正确呈现
Assets.xcassets
.
因此,Xcode 对图像有足够的了解来渲染它们,并且可以在没有警告或错误的情况下进行编译,但是在运行时图像会丢失。
解决方案(有副作用)
在四处寻找之后,我找到了一个可行的解决方案(但我不满意):
在应用程序的构建阶段设置中,我添加了一个复制项目MyPackage/Sources/MyPackage/Resources/Assets.xcassets
再次编译/运行后,图像可以正确渲染为故事板/xibs。很好,但有一些不良副作用:
- 编译/链接的二进制文件包含两个
Assets.xcassets
. 一进MyPackage
一出就是复制到App Bundle。 - 在 Xcode 中,
Assets.xcassets
在项目中出现两次。一个在MyPackage
应用程序源的根目录中。在不中断复制阶段的情况下无法移动或隐藏它。它们至少是符号链接的,所以编辑就是编辑另一个。
备择方案?
是时候寻求帮助了。我认为这不是最好的/预期的方式。我已经用尽了我的 google-fu。在 Apple 的文档中找不到详细信息。
我想象有一种更自定义的方式来执行复制步骤(可能不包括 Package.swift 中的资产目录)?或者可能是在“构建规则”选项卡中编译资产目录的一种方式?
还是我做对了?