预加载字体菜单

时间:2014-02-01 13:41:48

标签: macos cocoa

我正在编写一个具有自定义对话框的应用程序,该对话框包含一个NSPopupButton,它使用属性字符串显示所有可用字体,以便以实际字体显示字体名称。

因为我预计对话框只会打开应用程序运行时间的一小部分,所以它位于xib文件中,只在需要时加载。

我的“问题”是第一次(仅)当用户点击字体按钮时,有1 5-10秒滞后(旋转沙滩球)。我假设这是因为它必须呈现底层菜单。我在对话框的awakeFromNib中从FSFontManager加载字体,但这显然是不够的。

在我追逐一堆死胡同试图找出如何让菜单“预渲染”之前,有没有人对我最聪明的攻击线有什么建议? (最好是在一个单独的线程中)

由于

1 个答案:

答案 0 :(得分:2)

只想分享我最终的解决方案。

在app delegate的awakeFromNib中,我生成了一个新的线程,除了创建一个未连接的NNTextField之外什么也没做,循环使用该字体更新文本字段内容的整体字体,然后关闭它。

现在,除非我很快找到滞后的字体菜单,否则它会突然出现。

我在MainMenu.xib中创建了一个“自由浮动”的NSTextField(即它不属于任何窗口)并将其连接到app delegate中的IBOutlet。

以下内容来自我的app delegate的实现:

-(void)awakeFromNib
{
  // irrelevant stuff deleted...

  [NSThread detachNewThreadSelector:@selector(preloadFonts) toTarget:self withObject:nil];
}

-(void)preloadFonts
{
  NSTextField *tf = [[NSTextField alloc]init];
  NSArray *fonts = [[NSFontManager sharedFontManager] availableFontFamilies];
  [fonts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *name=obj;
    NSDictionary *attributes = [NSDictionary dictionaryWithObject:[NSFont fontWithName:name size:12.]
                                                           forKey:NSFontAttributeName];
    NSAttributedString *str = [[NSAttributedString alloc]initWithString:name attributes:attributes];
    [tf setAttributedStringValue:str];
  }];
}