2014-01-25 3 views
1

Я хочу создать всплывающее окно, подобное тому, которое находится в Pages.app (или в TextEdit.app), меню которого представляет собой отфильтрованный список семейств шрифтов.Как создать отфильтрованный набор доступных имен семейств шрифтов? (например, в Pages или TextEdit)

Я могу получить массив доступных имен фамилий шрифтов от [NSFontManager availableFontFamilies], но это дает гораздо больше семейств шрифтов, чем во всплывающем меню «Страницы».

С другой стороны, я могу получить то, что кажется правильно отфильтрованным набором дескрипторов шрифтов от [NSFontCollection fontCollectionWithName:NSFontCollectionUser], но также включает в себя каждый член семейства (курсив, полужирный и т. Д.). Я не хочу включать каждого члена в свой popup, только фамилии.

Я хочу отфильтрованный набор фамилия фамилии.

Имена, которые я выбрал из NSFontManager, кажутся дезинфицированными для пользовательского интерфейса, тогда как значения имен, которые я получаю из словаря атрибутов дескриптора шрифта ([myFontDescriptor fontAttributes][NSFontNameAttribute]), не являются. Поэтому я не могу просто сделать простой набор пересечений двух групп на основе строковых значений, то же самое может иметь разные имена.

+0

Вы смотрели на '' NSFontFamilyAttribute' и NSFontVisibleNameAttribute'? –

+0

@KenThomases Да. Я повторил массив шрифтовых дескрипторов, возвращаемых из fontCollection, записывая словарь атрибутов каждого из них, но каждый раз каждый раз были «NSFontNameAttribute» (со значениями, такими как «HelveticaNeue-CondensedBlack» и т. Д.) И «NSCTFontDesignLanguagesAttribute» (в моем случае , всегда со значениями «en»). – proxpero

+0

'NSFontDescriptor' немного странно в моем тестировании. Если вы зарегистрируете его напрямую или запросите его '-fontAttributes', вы можете получить очень мало атрибутов. Однако, если вы вызываете метод '-objectForKey:', вы можете получить больше. –

ответ

2

Вы можете использовать -[NSFontDescriptor objectForKey:] для извлечения атрибутов, отсутствующих в словаре -fontAttributes. Если вы используете ключ атрибута NSFontFamilyAttribute, это дает вам фамилию шрифта. Применение этого к каждому описателю шрифта в [NSFontCollection fontCollectionWithName:NSFontCollectionUser] должно дать вам то, что вам нужно.

+0

Я читал и перечитывал заголовки, документацию, статьи, сообщения в блогах и т. Д., И ни один источник (который я не видел) упоминает то, что вы так красноречиво заявили здесь. Ты только что спас мне здравый смысл. Почему в документах не указано ни одного места: «Использовать метод« objectForKey: »для извлечения атрибутов, не найденных в словаре' fontAttributes' ?! » Я имею в виду, что у документации, которую я локально, кажется, есть кое-что пропавшее без вести (начиная с Свифта), но вы бы подумали, что они уже фиксировали большую часть этого времени ... О, хорошо. Я просто хотел сказать спасибо. Ваш ответ очень ценится **. –

0
let collection = NSFontCollection(name: "Fixed Width") 
    var names = [String]() 
    for description in (collection?.matchingDescriptors)!{ 
     let name = description.fontAttributes[NSFontNameAttribute] as! String 
     names.append(name) 

    } 
    print(names) 

вот мой код, чтобы спасти кому-то какое-то время