2013-12-21 106 views
2

This answer描述如何設置NSMenuItem的字體以及字體顏色。設置NSMenuItem的字體顏色以突出顯示

爲了提醒用戶在彈出菜單中選擇的項目有問題,我將顏色設置爲紅色。很好用,除非項目突出顯示,背景變成藍色,而我的紅藍色很難看清,看起來很糟糕。常規菜單項的字體從黑色變爲白色。我希望修改後的菜單項在突出顯示時改變它的字體顏色。

這是一個動態菜單。當創建項目時,我在-menuNeedsUpdate中設置字體/顏色。當然, - [NSMenuItem isHighlighted]在那裏返回NO,因爲該項目剛創建。

我也嘗試添加上NSMenuDidBeginTrackingNotification和NSMenuDidBeginTrackingNotification觀察員,但要麼是因爲這兩個通知總是成對接受,三到六個月對我每次點擊菜單沒有幫助,再經過跟蹤已經結束另一個-menuNeedsUpdate:它再次從頭開始重新創建所有內容。我不確定當菜單「跟蹤」時它意味着什麼,但顯然它不是我想要的。

我認爲我會問是否有人曾經想出了一個很好的答案對於這一點,我才熄滅,做一些真的 kludgey喜歡these guys did for a similar NSMenuItem quandary

回答

3

您可以實現菜單的delegate以在突出顯示項目時得到通知。

#pragma mark - NSMenuDelegate 

- (void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item { 
    [menu.highlightedItem nik_restoreTextColor]; 
    [item nik_overrideTextColor:[NSColor selectedMenuItemTextColor]]; 
} 

它應該是非常簡單的刪除和重新添加單個項目的顏色。 但是,這裏是我用來記住和以後恢復顏色的通用解決方案:

@implementation NSMutableAttributedString(NIKExchangeAttribute) 

- (void)nik_renameAttribute:(NSString *)originalAttribute to:(NSString *)newAttribute { 
    NSRange fullRange = NSMakeRange(0, self.length); 
    [self removeAttribute:newAttribute range:fullRange]; 
    [self enumerateAttribute:originalAttribute 
        inRange:fullRange 
        options:0 
        usingBlock:^(id value, NSRange range, BOOL *stop) { 
     [self addAttribute:newAttribute value:value range:range]; 
    }]; 
    [self removeAttribute:originalAttribute range:fullRange]; 
} 

@end 

static NSString *const ORIGINAL_COLOR_KEY = @"nik_originalColor"; 

@implementation NSMenuItem(NIKOverrideColor) 

- (void)nik_overrideTextColor:(NSColor *)textColor { 
    NSMutableAttributedString *title = [self.attributedTitle mutableCopy]; 
    [title nik_renameAttribute:NSForegroundColorAttributeName to:ORIGINAL_COLOR_KEY]; 
    [title addAttribute:NSForegroundColorAttributeName 
        value:textColor 
        range:NSMakeRange(0, title.length)]; 
    self.attributedTitle = title; 
} 

- (void)nik_restoreTextColor { 
    NSMutableAttributedString *title = [self.attributedTitle mutableCopy]; 
    [title nik_renameAttribute:ORIGINAL_COLOR_KEY to:NSForegroundColorAttributeName]; 
    self.attributedTitle = title; 
} 

@end 
相關問題