macos - 预加载字体菜单

标签 macos cocoa

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

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

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

在我追寻一堆死胡同试图弄清楚如何让菜单“预渲染”之前,有人对我最聪明的攻击路线可能是什么有一些建议吗? (最好在单独的线程中???)

谢谢

最佳答案

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

在应用程序委托(delegate)的 awakeFromNib 中,我生成了一个新线程,它除了创建一个独立的 NNTextField 之外什么也不做,循环整体字体,使用该字体使用属性字符串更新文本字段的内容,然后自行关闭。

现在,除非我非常快地进入滞后的字体菜单,否则它会毫无滞后地弹出。

我在 MainMenu.xib 中创建了一个“自由 float ”NSTextField(即它不属于任何窗口)并将其连接到应用程序委托(delegate)中的 IBOutlet。

以下内容来 self 的应用程序委托(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];
  }];
}

关于macos - 预加载字体菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498766/

相关文章:

ios - 在实体 <NSSQLEntity Theaters id=3> 中找不到 coredata keypath nameOfMovie

ios - 为 CGFloat 赋值时使用 'f' 有什么意义?

objective-c - 在任务控制中将窗口移动到新空间

cocoa - 锁定 nswindow 的位置

swift - SecTransformExecute() 使用 EXC_BAD_ACCESS 使应用程序崩溃

objective-c - 如何比较/Users/john 格式的 URL 和文件 ://localhost/Users/etc 中的 URL

cocoa - 如何在没有 Accessibility API 的情况下在 Mac OS 中获取另一个应用程序窗口的标题、位置和大小?

java - 如何跨更新在 Mac 上保留 CAcerts keystore ?

node.js - 为什么 Node 在 Windows 上的运行速度比在 Macos 上慢?

c - 使用 C 函数 rename() 重命名文件