如何在 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 登录?

在 iOS 和 WatchOS 之间共享核心数据

如何在 watchOS 上基于分页的界面中的多个界面控制器之间共享变量

如何在 WatchOS 上通过 HealthKit 访问锻炼?

当watchOS应用程序使用HKWorkoutSession在后台运行时如何使WCSession可访问

如何在 watchOS 2 应用程序 Xcode 7 beta 5 中使用 Parse