一款开源的 Dark Mode 适配利器

知识小集

共 1223字,需浏览 3分钟

 ·

2022-03-09 16:56

从 macOS 10.14 Mojave 开始,Apple 引入了系统范围的 dark mode。目前,macOS 10.14+ 上的应用程序都需要对系统外观变化做出响应。


虽然内置的 AppKit UI 元素可以完美地处理这个问题,但应用程序通常会依赖于自定义控件、自定义绘图代码,或者是自定义颜色。


例如,以下代码将对 Dark Mode 做出完美响应。


let color = NSColor.textColor


由于依赖于系统颜色,所以一切都由 AppKit 自动处理。但下面这段代码就不会了,因为颜色值使用了硬编码:


let color = NSColor( deviceRed: 1, green: 0, blue: 0, alpha: 1 )


不过 Apple 也提供了一个很好的解决方案,这需要用到 Asset Catalog 文件。从 Xcode 10 开始,开发者可以在资产目录中创建自定义颜色,并使用名称标识,还可选择包含特定 UI 主题或设备的变体。


不幸的是,此功能仅适用于在 macOS 10.13 及更高版本上运行的应用程序。这基本上意味着您将不得不放弃对 macOS 10.12 及更低版本的支持。如果您需要支持 macOS 10.12 或更低版本,Apple 的官方建议(如 WWDC18 期间所见)实际上是使用条件平台检测代码对颜色进行硬编码。


为了解决这个适配问题,JD Gadina 和 Gregorio Zanon 开发并开源了 ColorSet


ColorSet 既是一个 macOS 应用程序,也是一个 macOS Swift 框架 ColorSetKit。该应用程序允许开发者创建包含颜色和变体的文件,就像资产目录文件一样,而框架允许在应用程序中使用名称从 .colorset 文件中检索颜色,就像 macOS 10.13 SDK 一样。


该应用程序允许您开发者建任意数量的颜色,每种颜色都有一个唯一的名称。对于每种颜色,可以设置可选的深色变体:


d2ecac4922606fd75fb477544b289f37.webp

那在开发过程中,该如何使用创建的 .colorset 呢?默认情况下,ColorSetKit 将在开发者的应用程序包中查找名为 Colors.colorset 的文件。


可以使用 NSColor 上的自定义方法检索颜色:


let color = NSColor.colorFromColorSet( "MyCustomColor" )


颜色组件本身不会对 UI 主题更改做出反应,但是 colorFromColorSet 方法将根据当前 UI 主题返回正确的颜色。这意味着如果您使用自定义绘图代码,则不应缓存颜色对象,而是直接从绘图代码中调用 colorFromColorSet。这样,每次重绘视图时都会使用正确的颜色(当 UI 主题更改时会自动发生)。


Github 地址可以点击“阅读原文”查看。

浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报