如何设置NSMenu / NSMenuItems的字体?

时间:2012-11-19 17:24:59

标签: objective-c cocoa interface-builder nsmenuitem nsmenu

我无法弄清楚如何在我的NSMenu中设置我的NSMenuItems的字体/样式。我在NSMenu上尝试了setFont方法,但它似乎对菜单项没有任何影响。 NSMenuItem似乎没有setFont方法。我希望他们都拥有相同的字体/样式,所以我希望我能在某处设置一个属性。

4 个答案:

答案 0 :(得分:8)

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];

文档:https://developer.apple.com/library/mac/#documentation/cocoa/reference/applicationkit/classes/nsmenuitem_class/reference/reference.html

答案 1 :(得分:8)

他们可以拥有属性标题,因此您可以将属性字符串设置为标题及其所有属性,包括字体:

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

答案 2 :(得分:3)

来自+ menuBarFontOfSize:

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];

答案 3 :(得分:1)

实际上[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