如何为NSView的Layer添加适配深色模式的颜色?
解决NSColor深浅模式不切换的问题
我已为NSColor添加了浅色模式与深色模式对应的自定义颜色,代码设置如下:
override func viewDidLoad() { super.viewDidLoad() titleLabel.textColor = .CP2 view.wantsLayer = true view.layer?.backgroundColor = NSColor.myColor.cgColor }
但无论处于深色模式还是浅色模式,颜色始终显示为「任意外观」下的颜色。
解决方案:
确保自定义颜色是动态颜色
如果你是通过代码定义自定义颜色,必须使用dynamicProvider创建能响应外观变化的动态颜色,而不是固定色值。示例:extension NSColor { static let CP2 = NSColor(dynamicProvider: { traits in traits.userInterfaceStyle == .dark ? NSColor.white : NSColor.black }) static let myColor = NSColor(dynamicProvider: { traits in traits.userInterfaceStyle == .dark ? NSColor.darkGray : NSColor.lightGray }) }若通过Asset Catalog创建颜色,需确认在资源文件中为「Any」「Dark」分别设置对应色值,代码中通过
NSColor(named: "MyColor")获取。处理CALayer的静态颜色问题
CGColor是静态颜色,不会随系统外观自动更新,因此直接在viewDidLoad中设置layer的backgroundColor会固定为当前外观的颜色。需要监听外观变化通知,在回调中重新赋值:override func viewDidLoad() { super.viewDidLoad() titleLabel.textColor = .CP2 view.wantsLayer = true updateLayerBgColor() // 监听外观切换通知 NotificationCenter.default.addObserver( self, selector: #selector(updateLayerBgColor), name: NSApplication.didChangeScreenParametersNotification, object: nil ) } @objc private func updateLayerBgColor() { view.layer?.backgroundColor = NSColor.myColor.cgColor } deinit { NotificationCenter.default.removeObserver(self) }版本兼容性检查
确保项目Deployment Target在macOS 10.14及以上,该版本开始支持系统动态颜色特性。
内容的提问来源于stack exchange,提问作者user1898829
相关产品推荐
相关产品推荐

