Objective c 如何设置NSMenu/NSMenuItems的字体?

Objective c 如何设置NSMenu/NSMenuItems的字体?,objective-c,cocoa,interface-builder,nsmenuitem,nsmenu,Objective C,Cocoa,Interface Builder,Nsmenuitem,Nsmenu,我不知道如何在NSMenu中设置NSMenuItems的字体/样式。我在NSMenu上尝试了setFont方法,但它似乎对菜单项没有任何影响。NSMenuItem似乎没有setFont方法。我希望它们都具有相同的字体/样式,因此我希望可以在某个地方设置一个属性。NSMenuItem支持将属性字符串作为标题: - (void)setAttributedTitle:(NSAttributedString *)string; 示例代码: NSMenuItem *menuItem = [[NSMenu

我不知道如何在NSMenu中设置NSMenuItems的字体/样式。我在NSMenu上尝试了setFont方法,但它似乎对菜单项没有任何影响。NSMenuItem似乎没有setFont方法。我希望它们都具有相同的字体/样式,因此我希望可以在某个地方设置一个属性。

NSMenuItem支持将属性字符串作为标题:

- (void)setAttributedTitle:(NSAttributedString *)string;
示例代码:

NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:@"Hi, how are you?" action:nil keyEquivalent:@""];
NSDictionary *attributes = @{
                              NSFontAttributeName: [NSFont fontWithName:@"Comic Sans MS" size:19.0],
                              NSForegroundColorAttributeName: [NSColor greenColor]
                            };
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:[menuItem title] attributes:attributes];
[menuItem setAttributedTitle:attributedTitle];

文档:

它们可以有一个属性化的标题,因此您可以将属性化字符串设置为标题,其中包含所有属性化的字体:

NSMutableAttributedString* str =[[NSMutableAttributedString alloc]initWithString: @"Title"];
[str setAttributes: @{ NSFontAttributeName : [NSFont fontWithName: @"myFont" size: 12.0] } range: NSMakeRange(0, [str length])];
[label setAttributedString: str];

实际上,
[NSMenu setFont::
适用于所有菜单项子菜单(如果最后一个菜单项没有自己的字体)。也许您在设置菜单字体之前设置了属性标题? 实现了它,在编写了自己的程序后遍历菜单项

如果您需要一些自定义处理(即并非所有项目都更改字体,或为不同项目自定义字体),下面是一个简单的迭代代码:

@implementation NSMenu (MenuAdditions)

- (void) changeMenuFont:(NSFont*)aFont
{
    for (NSMenuItem* anItem in self.itemArray)
    {
        NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:aFont forKey:NSFontAttributeName];
        anItem.attributedTitle = [[[NSAttributedString alloc] initWithString:anItem.title attributes:attrsDictionary] autorelease];

        if (anItem.submenu)
            [anItem.submenu changeMenuFont:aFont];
    }
}

@end

+menuBarFontOfSize:
from
NSFont
是您的朋友

  • 如果不打算更改字体系列,则应使用
    [NSFont menuBarFontOfSize:12]
    获取默认字体并设置新的大小
  • 如果只更改颜色,则仍需要通过执行
    [NSFont menuBarFontOfSize:0]
    将默认字体大小设置回原来的大小

因此,要仅更改
NSMenuItem
颜色:

NSDictionary *attributes = @{
                              NSFontAttributeName: [NSFont menuBarFontOfSize:0],
                              NSForegroundColorAttributeName: [NSColor greenColor]
                            };

NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:[menuItem title] attributes:attributes];
[menuItem setAttributedTitle:attributedTitle];

这是最好的方法吗?然后,我必须迭代菜单并更改每个项目,每次添加新项目时,我都必须设置属性标题。您可以编写个人setter,除了设置字符串值之外,还可以设置字体。如果需要使用属性执行复杂操作,请使用子类NSTextField。属性标题是实现这一点的最佳方法吗?然后我必须迭代菜单并更改每个项目,每次添加新项目时,我必须设置属性标题。我希望能有一个方法来设定一次如何利用你的例子?