You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:10:15