macos - 设置 NSMenuItem 的字体颜色在突出显示时交替显示

标签 macos cocoa fonts nsmenuitem

This answer描述如何设置 NSMenuItem 的字体以及字体颜色。

为了提醒用户弹出菜单中所选项目的问题,我将颜色设置为红色。效果很好,除了当该项目突出显示时,背景变成蓝色,而且我的蓝底红字很难阅读并且看起来很糟糕。常规菜单项的字体从黑色变为白色。我希望修改后的菜单项在突出显示时更改其字体颜色。

这是一个动态菜单。我在创建项目时在 -menuNeedsUpdate 中设置字体/颜色。当然,-[NSMenuItem isHighlighted] 在那里返回 NO,因为该项目刚刚被创建。

我还尝试在 NSMenuDidBeginTrackingNotification 和 NSMenuDidBeginTrackingNotification 上添加观察者,但这也没有帮助,因为这两个通知总是成对接收,每次我单击菜单时三到六对,然后跟踪后有 结束是另一个 -menuNeedsUpdate:它再次从头开始重新创建所有内容。我不确定菜单“跟踪”时意味着什么,但显然这不是我想要的。

我想在我去做一些真正these guys did for a similar NSMenuItem quandary 这样的事情之前,先问问是否有人对此提出过一个好的答案。 .

最佳答案

您可以实现菜单的委托(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

关于macos - 设置 NSMenuItem 的字体颜色在突出显示时交替显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722374/

相关文章:

objective-c - 内存管理/所有权问题?

css - 不同字体的不同字体粗细

css - CSS 中字体的别名

python - 将 anaconda 指向 Mac Python 库

python - 如何在 iTerm 2(使用 API)中获取和设置窗口、选项卡和 session 的标题?

Javah 仍然无法在 OSX/Android Studio 中找到类文件

node.js - npm 不起作用,总是出现这个错误 -> 错误 : Cannot find module 'are-we-there-yet'

objective-c - Cocoa:测试 NSString 是不可变的还是可变的?

objective-c - 在 Mac 上使用 AVFoundation 捕获 iSight 图像

java - 如何在工具栏android中为标题设置自定义字体