2013-06-22 2 views
1

Интересно, можно ли отображать живые шрифты в элементе управления popupbutton (NSPopupButton)? В настоящее время я загружаю popupbutton со списком шрифтов, доступных следующим образом.NSPopupButton с живыми шрифтами (стилизованный текст)

NSArray *familyNames = [[NSFontManager sharedFontManager] availableFontFamilies]; 
NSMutableArray *fontarray = [[NSMutableArray alloc] initWithObjects:nil]; 
[fontarray addObject:@"- Select one - "]; 
for (NSString *family in familyNames) { 
    [fontarray addObject:family]; 
} 
[fontmenu1p addItemsWithTitles:fontarray]; 

Возможно, что-то вроде следующего, используя NSMutableAttributedString?

for (NSString *family in familyNames) { 
    NSDictionary *attr1 = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:family size:[NSFont systemFontSize]],NSFontAttributeName,[NSColor blackColor],NSForegroundColorAttributeName,nil]; 
    NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:family]; 
    [aString setAttributes:attr1 range:NSMakeRange(0,family.length-1)]; 
    [fontarray addObject:aString]; 
} 
[fontmenu1p addItemsWithTitles:fontarray]; 

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

Благодарим за помощь.

+0

Откуда у вас ошибка за пределами границ? – gaige

+0

Я думаю, что это последняя строка. Я не могу точно сказать, потому что для этого нужно более ста шрифтов. Благодарю. –

+0

Моя первая мысль заключалась в том, что fontarray может быть пустым. На самом деле, это не так. Я получаю 348, если подсчитываю количество элементов. Фактически, если я покажу один из объектов с NSLog, я получаю следующее. Arial Blac { NSColor = "NSCalibratedWhiteColorSpace 0 1"; NSFont = "\" Arial-Black 13.00 pt. P [] (0x100528bc0) fobj = 0x101b36150, spc = 4.34 \ ""; Итак, я думаю, что NSPopupButton не может отображать стилизованный текст? Ну, вы можете сделать это с VisualBasic/C#. Поэтому я думал, что смогу сделать это с помощью Objective-C. –

ответ

3

Даже я не тестировал его, я думаю, что наш подход не сработает. NSPopUpButton имеет удобный API для своего меню. Удобный, но короткий. (Обычно всплывающие элементы не отнесены, никаких отдельных видов и т. Д.)

Я бы попытался создать экземпляр NSMenuItem для каждого элемента. Существует сеттер -setAttributedTitle:, который позволяет вам устанавливать атрибутные строки. Затем вам необходимо заполнить эту запись экземпляром NSMenu и set the menu.

BTW: [aString setAttributes: attr1 range: NSMakeRange (0, family.length-1)]; Почему -1? Длина - это длина, а не индекс последнего символа. И вы хотите установить диапазон, который принимает длину, а не индекс последнего символа.

+0

Умм ... Я сначала задал размер family.length. Увидев ошибку, я изменил ее на family.length - 1. Я не был уверен. Спасибо что подметил это. –

+0

Конечно: у вас была проблема с индексом, и это первое, что нужно сделать, чтобы уменьшить диапазоны. Но я не думаю, что это проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^