如何在 watchOS 应用程序的共享框架中访问资产目录中的颜色?
Posted
技术标签:
【中文标题】如何在 watchOS 应用程序的共享框架中访问资产目录中的颜色?【英文标题】:How to access color from an asset catalog in a shared framework in a watchOS app? 【发布时间】:2020-09-14 13:36:15 【问题描述】:我的 ios 和 watchOS 应用程序之间有一个共享框架,其中包含一个带有一些命名颜色的资产目录。我想在我的 watchOS 应用程序中访问命名颜色。在 iOS 中,我可以使用 UIColor.init(named name: String, in bundle: Bundle, compatibleWith traitCollection: UITraitCollection)
告诉系统从传入的 Bundle 中访问名称。
watchOS 还声称从 watchOS 4 开始提供此初始化程序;但是,Xcode 自动完成没有找到它,当我尝试使用它时出现构建错误,这有点奇怪,因为 UITraitCollection
(这是该方法签名的一部分)无论如何都不会在 watchOS 中暴露给我们。
如何从共享框架中的资产目录访问资产?
【问题讨论】:
【参考方案1】:不确定这是最好的解决方案,但我将 iOS Assets.xcassets 添加到了我的 目标会员面板中的 WatchApp 扩展,这解决了问题。
【讨论】:
谢谢 - 这可能比手动复制框架和手表应用程序之间的每个资产稍微好一点,但它最终仍然是复制资产。 ?【参考方案2】:我有同样的问题,将提交反馈/雷达,但同时能够使用 SwiftUI 的 Color
对象,它具有 init(_ name: String, bundle: Bundle? = nil)
作为 watchOS 上的桥梁,并使用 UIColor(Color)
构造函数来获取等效的UIColor
实例。即:
UIColor(Color("myColor", bundle: myBundle))
在我的特定情况下,我正在使用的实际代码通过 UIColor、Color 和 Bundle 上的扩展公开,因此我可以键入对资产目录和捆绑包的访问权限,但这本质上是引擎盖下的机制。
【讨论】:
【参考方案3】:这是一个 hack,但我创建了一个 objc 标头以使 UITraitCollection
定义可用于 watchOS。
这允许访问 UIColor(named name: String, in bundle: Bundle?, compatibleWith traitCollection: UITraitCollection?)
方法。
Objc 头文件添加到框架中:
#if TARGET_OS_WATCH
@import UIKit;
@interface UITraitCollection : NSObject
@end
#endif
【讨论】:
以上是关于如何在 watchOS 应用程序的共享框架中访问资产目录中的颜色?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 iOS 和 WatchOS 应用之间共享 Firebase Auth 登录?
如何在 watchOS 上基于分页的界面中的多个界面控制器之间共享变量
如何在 WatchOS 上通过 HealthKit 访问锻炼?