更改NSWindow标题栏的颜色

4

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


你可能想查看以下问题: https://dev59.com/3XI-5IYBdhLWcg3wy76n#1665421 - Leibowitzn
我已经发布了答案。请在这里查看我的答案。 - Muruganandham K
3个回答

5

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主要版本中进行测试。


链接页面未找到。 - Amit Hooda

5

要改变窗口工具栏的颜色:

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

1

这里使用了私有方法,但是可以正常工作:

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的成员”。 - Sam
尝试将viewObject转换为NSTextField...但对于我的应用程序仍然无效。 - David Karlsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接