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