【问题标题】:Changing color of the NSWindow titlebar更改 NSWindow 标题栏的颜色
【发布时间】:2011-03-03 22:12:33
【问题描述】:

我正在开发一个桌面应用程序,我想在其中更改 NSWindow 标题栏的颜色。我该怎么做?

【问题讨论】:

标签: cocoa colors nswindow titlebar


【解决方案1】:

NSWindow 的内容视图有一个超级视图,它是 NSThemeFrame 的一个实例。该类负责绘制标题文本、窗口/工具栏背景纹理,并包含其他所有内容的子视图(关闭按钮、全屏按钮、NSDocument 图标等)。

您可以使用 Objective-C 运行时将 NSThemeFrame 的 drawRect: 方法替换为您自己的方法,该方法将调用父实现,然后在其之上执行自定义绘图。

还有一个私有方法可以找到绘制标题的矩形,NSFont 上还有一个公共方法可以找到它的字体和字体大小。

我所做的是将窗口背景颜色设置为纯色(黑色)而不是渐变/纹理,然后将其设置为“纹理”窗口(这会导致实际呈现背景颜色,否则它不会发生),然后我在我知道标题已被绘制的区域的标题栏上绘制一个黑色方块,然后在其位置绘制我自己的标题,浅灰色而不是深灰色。

源代码在这里:https://github.com/abhibeckert/Dux/blob/master/Dux/DuxProjectWindow.m(注意:如果 DUX_DARK_MODE == 1,它只会自定义标题文本颜色)

这样做可能会使您的应用在 Mac App Store 中被屏蔽,但它相当可靠。只需确保在每个新的 OS X 主要版本上都对其进行测试。

【讨论】:

  • 链接上找不到页面
【解决方案2】:

改变窗口工具栏的颜色:

  1. 在属性检查器中设置带纹理的窗口样式。
  2. 在代码中:[window setBackgroundColor: MyCustomColor];

【讨论】:

    【解决方案3】:

    这使用私有方法,但有效:

    NSEnumerator *viewEnum = [[[[[[window contentView] superview] titlebarViewController] view] subviews] objectEnumerator];
    NSView *viewObject;
    
    while(viewObject = (NSView *)[viewEnum nextObject]) {
       if([viewObject className] == @"NSTextField") [viewObject setTextColor: .. your color .. ];
    }
    

    【讨论】:

    • 如何强制 Xcode 接受私有方法的使用?我试图模仿你使用 Swift 的建议,它只是抱怨“视图没有名为 titlebarViewController 的成员”。
    • 尝试将 viewObject 转换为 NSTextField...虽然仍然不适用于我的应用程序
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多