Я пытаюсь добавить пользовательский вид в NSMenuItem в строке меню OS X 10.10 Yosemite.
Пользовательский вид - это просто фон NSView с меткой NSTextField.
Проблема заключается в том, что фоновому NSView присваивается яркость/прозрачность стиля Йосемити при добавлении в меню. Метка NSTextfield не является.
Благодаря использованию NSRectFillUsingOperation
, я получил это, чтобы хорошо выглядеть для некоторых цветов фона в Yosemite. Но другие продолжают не совпадать. Когда он работает, после ручного "выделения" вида исходные цвета меняются и больше не совпадают. Я могу выкопать код примера для этого, если это необходимо.
Затем, когда он выглядит несколько хорошо в Йосемити, он выглядит ужасно в 10.9 Маверикс.
Я также попытался установить для свойства wantsLayer
значение YES, чтобы включить представление в CALayer-backed view. Это создает другие проблемы, такие как текст, а не сглаживание правильно на ясном фоне.
Мой вопрос:
Как отобразить метку поверх пользовательского представления NSMenuItem? Фон метки должен точно соответствовать фону представления. Решение должно работать в Йосемити и Маверикс.
Пример кода ниже:
self.statusItem = [[NSStatusBar systemStatusBar]
statusItemWithLength:NSVariableStatusItemLength];
[self.statusItem setTitle:@"TEST"];
[self.statusItem setHighlightMode:YES];
[self.statusItem setEnabled:YES];
[self.statusItem setTarget:self];
NSMenu *menu = [[NSMenu alloc] init];
[menu addItemWithTitle:@"Disabled menu item" action:nil keyEquivalent:@""];
[menu addItemWithTitle:@"Enabled menu item" action:@selector(enabled) keyEquivalent:@""];
NSTextField *label = [[NSTextField alloc] initWithFrame:NSMakeRect(30, 20, 50, 20)];
label.stringValue = @"label";
label.editable = NO;
label.bordered = NO;
label.backgroundColor = [NSColor blueColor];
//label.backgroundColor = [NSColor clearColor];
PKMenuItemView *view = [[PKMenuItemView alloc] initWithFrame:NSMakeRect(0, 0, 200, 50)];
[view addSubview:label];
NSMenuItem *viewMenuItem = [[NSMenuItem alloc] init];
[viewMenuItem setView:view];
[menu addItem:viewMenuItem];
self.statusItem.menu = menu;
Я подклассифицировал NSView, чтобы переопределить drawRect:
и нарисовать цветной фон:
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
[[NSColor blueColor] setFill];
NSRectFill(dirtyRect);
//NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
}