2014-02-01 2 views
1

Я пишу приложение, в котором есть диалоговое окно настройки, содержащее NSPopupButton, который отображает все доступные шрифты, используя атрибутные строки, чтобы отображать имя шрифта в фактическом шрифте.Меню предварительной загрузки шрифтов

Поскольку я ожидаю, что открытое диалоговое окно будет открыто только в разное время, когда приложение будет запущено, оно находится в файле на xib и загружается только при необходимости.

Моя «проблема» заключается в том, что в первый раз (только), когда пользователь нажимает на кнопку шрифта, есть 1 5-10 секундное отставание (с вращающимся пляжным мячом). Я предполагаю это, потому что он должен отображать основное меню. Я загружаю шрифты из FSFontManager во время awakeFromNib диалогового окна, но этого явно недостаточно.

Прежде, чем я преследую кучу тупиков, пытаясь понять, как получить меню в «предварительную визуализацию», есть ли у кого-нибудь какие-то предложения о том, что может быть моей самой умной линией атаки? (Желательно в отдельном потоке ???)

Благодаря

ответ

2

Просто хотел разделить решение, которое я в конечном итоге происходит с.

В awakeFromNib делегата приложения я породил новый поток, который ничего не делал, но создавал непривязанные общие шрифты NNTextField, которые обновляли содержимое текстового поля с помощью атрибутной строки, используя этот шрифт, а затем закрывали себя.

Теперь, если я не очень быстро попадал в меню шрифтов, которое было отстающим, оно всплывает без запаздывания.

Я создал «свободный плавающий» NSTextField в MainMenu.xib (т. Е. Не был частью какого-либо окна) и связал его с 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]; 
    }]; 
} 
Смежные вопросы