我正在编写一个具有自定义对话框的应用程序,该对话框包含一个NSPopupButton,它使用属性字符串显示所有可用字体,以便以实际字体显示字体名称。
因为我预计对话框只会打开应用程序运行时间的一小部分,所以它位于xib文件中,只在需要时加载。
我的“问题”是第一次(仅)当用户点击字体按钮时,有1 5-10秒滞后(旋转沙滩球)。我假设这是因为它必须呈现底层菜单。我在对话框的awakeFromNib中从FSFontManager加载字体,但这显然是不够的。
在我追逐一堆死胡同试图找出如何让菜单“预渲染”之前,有没有人对我最聪明的攻击线有什么建议? (最好是在一个单独的线程中)
由于
答案 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];
}];
}