我正在尝试将自定义视图添加到OS X 10.10 Yosemite菜单栏中的NSMenuItem。
自定义视图只是一个带有NSTextField“标签”的NSView背景。
问题在于,当将其添加到菜单中时,背景NSView会获得Yosemite风格的模糊/透明效果,而NSTextfield标签则不会。
通过使用NSRectFillUsingOperation
,我已经使某些背景颜色在Yosemite中看起来很好。但其他颜色继续不匹配。当它有效时,在手动“突出显示”视图后,原始颜色会发生变化,不再匹配。如果需要,我可以找到一些示例代码。
然后,当在Yosemite中看起来还不错时,在10.9 Mavericks中看起来非常糟糕。
我还尝试将wantsLayer
属性设置为YES,将该视图转换为CALayer支持的视图。这会创建其他问题,例如文本未正确针对清晰背景进行抗锯齿处理。
我的问题:
如何在NSMenuItem自定义视图的顶部显示标签? 标签的背景必须完全匹配视图的背景。 解决方案必须在Yosemite和Mavericks中均可行。
以下是示例代码:
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);
}
clearColor
背景那么简单。这会导致一些问题的组合:模糊的标签文本,一个实际上并非透明的背景,或者是完全透明的背景,在Mavericks中会显示到桌面上。 - pkamb_viewHandlesEvents
的答案:https://dev59.com/4VPTa4cB1Zd3GeqPnuxg - pkamb