代码之家  ›  专栏  ›  技术社区  ›  Todd Ditchendorf

如何获得NSWindow标题栏和内容视图背景的默认DarkMode“着色”颜色?

  •  0
  • Todd Ditchendorf  · 技术社区  · 4 年前

    设置:

    Mac OS蒙特利12.3.1(21E258)

    步骤

    1. 激活黑暗模式。
    2. 启动Xcode。
    3. 文件>新建>项目>macOS>应用程序,单击“下一步”。
    4. 产品名称:ColorTest,接口:Xib,语言:Objective-C
    5. 位置:Dektop,点击“创建”
    6. 产品>跑

    后果

    请参阅ColorTest应用程序窗口启动。窗口标题栏颜色和窗口内容视图背景颜色都略微着色,以匹配当前选定的桌面背景。这些是纯色的。它们是 半透明的“材质”颜色。

    enter image description here

    通过启动“常规”系统首选项窗格,可以看到这些相同的着色颜色。

    enter image description here enter image description here

    问题

    我想通过编程获得这两种颜色(实心但着色的标题栏颜色和实心但着色窗口内容背景颜色),这样我就可以在运行时在 -[NSView drawRect:] 。我期待这样的东西:

    NSColor *color = [NSColor windowBackgroundColor];
    [color setFill];
    NSRectFill(self.bounds);
    

    我想 -[NSColor windowBackgroundColor] 可能会返回这些颜色中的一种或另一种,但它不会。我已经检查了许多其他这样的标准颜色方法 NSColor ,但没有一个与这两种颜色相匹配。

    似乎在运行时找到这两种颜色应该非常简单。但我被难住了。找不到它们。他们在哪里?

    1 回复  |  直到 4 年前
        1
  •  2
  •   Todd Ditchendorf    4 年前

    你需要 NSVisualEffectView 具有 .behindWindow 具有.contentBackground和.titlebar材质的blendingMode。然后在drawRect中使用这些颜色会得到你所看到的。

        2
  •  0
  •   Jonny    3 年前

    创建 NSVisualEffectView 混合模式设置为 .withinWindow

        let effectView = NSVisualEffectView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
        effectView.blendingMode = .withinWindow
        effectView.material = .titlebar // or .windowBackground
        view.addSubview(effectView)