Я разрабатываю настольное приложение, в котором хочу изменить цвет строки заголовка NSWindow. Как именно я могу это сделать?
Изменение цвета заголовка NSWindow
Ответы (3)
Представление содержимого 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.
Чтобы изменить цвет панели инструментов окна:
- Установите стиль окна Textured в инспекторе атрибутов.
- В коде:
[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 .. ];
}