我正在编写一个应用程序,它有一个自定义对话框,其中包含一个 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/