我正在开发一个桌面应用程序,想要更改NSWindow的标题栏颜色。具体怎么做呢?
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主要版本中进行测试。
要改变窗口工具栏的颜色:
[window setBackgroundColor: MyCustomColor];
这里使用了私有方法,但是可以正常工作:
NSEnumerator *viewEnum = [[[[[[window contentView] superview] titlebarViewController] view] subviews] objectEnumerator];
NSView *viewObject;
while(viewObject = (NSView *)[viewEnum nextObject]) {
if([viewObject className] == @"NSTextField") [viewObject setTextColor: .. your color .. ];
}