【问题标题】:How to set the font of NSMenu/NSMenuItems?如何设置 NSMenu/NSMenuItems 的字体?
【发布时间】:2012-11-07 16:18:39
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 属性标题是最好的方法吗?然后我必须遍历菜单并更改每个项目,每次添加新项目时我都必须设置属性标题。
    • 您可以编写您的个人设置器,除了设置字符串值外,还设置字体。如果您需要使用属性执行复杂的操作,请使用子类 NSTextField。
    【解决方案2】:

    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

    【讨论】:

    • 属性标题是最好的方法吗?然后我必须遍历菜单并更改每个项目,每次添加新项目时,我都必须设置属性标题。我希望有一种方法可以设置一次
    • stackoverflow.com/questions/32426341/… 如何在您的示例中利用这一点?
    【解决方案3】:

    来自NSFont+ menuBarFontOfSize:是你的朋友。

    • 如果您不打算更改字体系列,则应使用[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];
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多