Catalyst APP 适配暗色模式

Catalyst 可以自动适配系统的亮暗色模式,APP 可以跟随系统设置的亮暗色切换而改变配色。
那么如果要在 APP 中实现用户单独设定亮暗色配色,不受系统设定影响呢?
我们知道,在 iOS APP 中,可以通过 override UIView/UIViewController/… 的 overrideUserInterfaceStyle 属性来覆盖系统的设定。
当重写了某一个 UIView 的

override var overrideUserInterfaceStyle {
    .light
}

后,这个 view 就不会受到用户切换系统亮暗色的影响,一直显示亮色配色了。
进一步,override UIWindow 的 overrideUserInterfaceStyle,可以在 window 层(和它所有的子视图)实现同样的效果。这项功能在 Catalyst 中也是适用的。

看到这里,你可能感觉我写了一堆废话,然鹅,事情没有这么简单…

当为 Catalyst 加入 NSToolbar 的支持后,你会惊奇的发现,override UIWindow 的 overrideUserInterfaceStyle 属性,并不会改变 NSToolbar 的配色。翻遍所有 API 也找不到能够影响 NSToolbar 配色的办法。

截屏2021-12-08 下午5.27.43.png

NSToolbar 就这么固执的跟随系统亮暗色而改变。在 Catalyst 层面,我们好像毫无办法。

解决方案 1 🙅♂️

在做了一些搜索后,我首先发现了一个配置项。

defaults write app.bundleID NSRequiresAquaSystemAppearance -bool Yes

在终端中通过执行这行代码,可以强行让 APP 保持亮色。当然,在 Info.plist 中做配置也可以做到同样的效果。好像可行,实则扯淡,在 APP 中实现独立动态切换亮暗色无法通过这个办法实现。

突然之间,我有了一个想法,如果在 UserDefault 设定 NSRequiresAquaSystemAppearance 会怎么样呢?

UserDefaults.standard.set(true, forKey: "NSRequiresAquaSystemAppearance")
UserDefaults.synchronize()

运行前先把系统切换为暗色模式,然后构建运行,好像没啥结果,哈哈哈
再次构建,奇迹出现 🎉,卧槽这也行
这个看上去可行的方案,实则有一个致命的弊端,就是当次设置不生效,需要 APP 重启才生效😭,最后还是扯淡

解决方案 2 🙆♂️…?

既然从 Catalyst 着手路线走不通,那么从 APPKit 为起点开始再次调查。翻看苹果的文档后,发现了一个事情: MacAPP 实现暗色模式的方式,和 UIKit 完全不同。
Mac 通过给 NSApplication 设定 appearance 属性来实现配色切换。

// 暗色
NSApplication.shared.appearance = NSAppearance(named: .darkAqua)
// 亮色
NSApplication.shared.appearance = NSAppearance(named: .aqua)
// 跟随系统
NSApplication.shared.appearance = nil

在做了一个 APPKit 的实例测试后,验证了正确性。解下来的问题就是想办法在 Catalyst 中调用这个 API。因为 Catalyst 实际还是运行在 MacOS 中的,所以在 Catalyst 中调用 APPKit 接口在理论上可行。
如果熟悉 Runtime 的同学不需要往下看了,通过 Runtime 来摸索吧各位。

如果你跟我一样是小白,为了节省下来你宝贵的时间去摸鱼,就直接参照下面的方法…
需要用到 Dynamic 框架,在这里

let app = Dynamic.NSApplication.sharedApplication
// 亮色
app.appearance = Dynamic.NSAppearance.appearanceNamed("NSAppearanceNameAqua")
// 暗色
app.appearance = Dynamic.NSAppearance.appearanceNamed("NSAppearanceNameDarkAqua")
// 跟随系统
app.appearance = .nil

拿走不谢,转载请注明出处,否则一礼拜拉不出粑粑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容