2011-05-19 71 views
16

我創建了一個簡單的NSStatusBar,其中NSMenu設置爲菜單。我也爲這個菜單添加了一些NSMenuItems,這些菜單工作正常(包括選擇器和高亮顯示),但只要添加了自定義視圖(setView :),就不會出現高亮顯示。使用自定義視圖突出顯示NSMenuItem?

CustomMenuItem *menuItem = [[CustomMenuItem alloc] initWithTitle:@"" action:@selector(openPreferences:) keyEquivalent:@""]; 
[menuItem foo]; 
[menuItem setTarget:self]; 
[statusMenu insertItem:menuItem atIndex:0]; 
[menuItem release]; 

而且我foo的方法是:

- (void)foo { 
    NSView *view = [[NSView alloc] initWithFrame:CGRectMake(5, 10, 100, 20)]; 
    [self setView:view]; 
} 

如果我刪除的setView方法,它會突出。

我已搜索和搜索,無法找到實現/啓用此方法。

編輯

我按照此問題的代碼在我的NSView子類實現亮點:

An NSMenuItem's view (instance of an NSView subclass) isn't highlighting on hover

#define menuItem ([self enclosingMenuItem]) 

- (void) drawRect: (NSRect) rect { 
    BOOL isHighlighted = [menuItem isHighlighted]; 
    if (isHighlighted) { 
     [[NSColor selectedMenuItemColor] set]; 
     [NSBezierPath fillRect:rect]; 
    } else { 
     [super drawRect: rect]; 
    } 
} 
+3

這是一個無用的'#define'。 – NSAddict 2014-02-04 12:21:38

+0

[NSMenuItem的視圖(NSView子類的實例)在懸停時不突出顯示]的可能重複(http://stackoverflow.com/questions/2917713/an-nsmenuitems-view-instance-of-an-nsview-subclass -isnt-highlighting-on-hove) – nschum 2014-10-25 13:53:16

回答

6

如果要添加一個視圖菜單項,該觀點必須自己畫出亮點。恐怕你不能免費得到這些。從Menu Programming Topics

與視圖中的菜單項不畫它的標題,狀態,字體,或其他標準圖紙的屬性,並分配完全繪製責任的看法。

+0

啊,該死的 - 謝謝。 – rdougan 2011-05-19 06:04:45

+0

不客氣! – 2011-05-19 06:05:24

3

是的,如前所述,您必須自己繪製。我使用AppKit的NSDrawThreePartImage(...)進行繪製,並且還包括使用用戶控件外觀(藍色或石墨)的檢查。要獲取圖像,我只是從屏幕截圖中截取它們(如果有人知道更好的方法,請添加註釋。)這裏是我的一塊MenuItemView的drawRect的:

// draw the highlight gradient 
if ([[self menuItem] isHighlighted]) { 

    NSInteger tint = [[NSUserDefaults standardUserDefaults] integerForKey:@"AppleAquaColorVariant"]; 
    NSImage *image = (AppleAquaColorGraphite == tint) ? menuItemFillGray : menuItemFillBlue; 

    NSDrawThreePartImage(dirtyRect, nil, image, nil, NO, 
     NSCompositeSourceOver, 1.0, [self isFlipped]); 
} 
else if ([self backgroundColor]) { 

    [[self backgroundColor] set]; 
    NSRectFill(dirtyRect); 
} 

編輯

應該定義這些:

enum AppleAquaColorVariant { 
    AppleAquaColorBlue = 1, 
    AppleAquaColorGraphite = 6, 
}; 

這些對應於在系統偏好設置兩個外觀選項。此外,menuItemFillGray & menuItemFillBlue只是標準菜單項填充漸變的NSImages。

+0

你能解釋一下AppleAquaColorGraphite或menuItemFillGray是什麼嗎?也許發佈整個drawRect方法? ;-) – tamasgal 2011-05-20 23:13:42

+0

我寫了一些代碼來使用selectedMenuItemColor和漸變繪製突出顯示的背景。請參閱[我的答案以完全匹配所選NSMenuItem的背景](http://stackoverflow.com/a/25984748/196844)。 – 2014-09-22 23:57:00

9

這是上面的一個不太冗長的版本。這對我來說很好。 (背景顏色是伊娃。)

- (void)drawRect:(NSRect)rect 
{ 
    if ([[self enclosingMenuItem] isHighlighted]) { 
     [[NSColor selectedMenuItemColor] set]; 
    } else if (backgroundColour) { 
     [backgroundColour set]; 
    } 
    NSRectFill(rect); 
} 
+0

只是好奇:你爲什麼會用主要API使用美式英語的語言編寫英式英語?如果它不是英語,你還會用你的母語嗎? – 2014-04-16 06:37:57

+0

請注意,如果drawRect:在您移動鼠標時未被調用,請確保您的菜單項實際上已啓用。它需要爲存在的選擇器設置一個操作。 – robotspacer 2016-09-25 10:32:36