预加载字体菜单



我正在编写一个应用程序,该应用程序具有一个自定义对话框,其中包含一个nspopupupupton,使用属性字符串显示所有可用字体,以便在实际字体中显示字体名称。p>因为我预计对话框仅打开应用程序运行的时间的一小部分,所以它在其XIB文件中,并且仅在需要时加载。

我的"问题"是,仅在用户点击字体按钮时(仅)第一次(仅)有1 5-10秒的滞后(带有旋转的沙滩球)。我认为这是因为它必须渲染基础菜单。我正在对话框的Awakefromnib期间从FSFontManager加载字体,但这显然不足。

在我追逐一堆死胡同之前,试图弄清楚如何将菜单放到"预渲染"之前,有人对我最聪明的攻击线可能是什么建议?(最好在单独的线程中???)

谢谢

只是想分享我最终与之一起使用的解决方案。

在应用程序代表的Awakefromnib中,我催生了一个新线程,该线程无需做任何操作,而只是创建一个未连接的nntextfield,Loop整体字体,使用该字符使用属性字符串更新文本字段的内容,然后关闭本身。

> > >

现在,除非我真的很快到达落后的字体菜单,否则它会弹出而没有滞后。

我在mainmenu.xib中创建了一个"自由浮动" nstextfield(即它不是任何窗口的一部分),并将其连接到应用程序委托中的iboutlet。

以下是我的应用程序代表的实现:

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

最新更新