Обработка шрифта
Эта глава объясняет, как текстовая система Какао имеет дело со шрифтами. Это объясняет, как использовать панель Font в Вашем приложении, как работать непосредственно с объектами шрифта, и как работать с менеджером по шрифту.
Панель шрифта
Панель Font, также названная окном Fonts, является объектом пользовательского интерфейса, выводящим на экран список доступных семейств шрифтов и стилей, позволяя пользователю предварительно просмотреть их и измениться, шрифт раньше выводил на экран текст. Текстовые объекты, такой как NSTextView
, работа с NSFontPanel
и NSFontManager
объекты реализовать систему преобразования шрифта AppKit. По умолчанию текстовый объект сохраняет панель Font обновленной с первым шрифтом в его выборе, или с его атрибутами ввода. Это также изменяет шрифт, в котором это выводит на экран текст в ответ на сообщения от панели Font и меню Font. Такие изменения применяются к выделенному тексту или вводящим атрибутам для объекта обогащенного текста или ко всему тексту в объекте простого текста.
NSFontManager
концентратор для преобразования шрифта — т.е. изменяя черты объекта шрифта, такие как его размер или гарнитура. Менеджер по шрифту получает сообщения от панели Font и отправляет сообщениям цепочку респондента для действия с текстовыми объектами.
Обычно, панель Font приложения выводит на экран все стандартные шрифты, доступные в системе. Если это не подходяще для Вашего приложения — например, если только шрифты фиксированной подачи должны использоваться — можно присвоить делегата в NSFontPanel
возразите для фильтрации доступных шрифтов. Перед NSFontPanel
объект добавляет определенное семейство шрифтов или поверхность к ее списку, NSFontPanel
объект просит, чтобы его делегат подтвердил дополнение путем отправки делегату a fontManager:willIncludeFont:
сообщение. Если возвращается делегат TRUE
(или не реализует этот метод), шрифт добавляется. Если возвращается делегат FALSE
, шрифт не добавляется. Этот метод должен быть вызван перед загрузкой основного файла пера.
Создание панели шрифта
В целом Вы добавляете средства панели Font к Вашему приложению, вместе с NSFontManager
возразите и меню Font, через которое пользователь открывает панель Font, с помощью Интерфейсного Разработчика. Вы делаете это путем перетаскивания меню Font или Format (который содержит подменю Font) в одно из меню приложения. Во время выполнения объект панели Font создается и сцепляется в систему преобразования шрифта. Можно также создать (или доступ) панель Font с помощью sharedFontPanel
метод класса.
Можно добавить пользовательский объект представления к NSFontPanel
объектное использование setAccessoryView:
, разрешение Вам добавить пользовательские элементы управления к панели Font. Можно также ограничить выведенные на экран шрифты (по умолчанию, все шрифты выведены на экран) путем присвоения делегата в менеджере по шрифту приложения объект.
Если Вы хотите NSFontManager
объект инстанцировать панели Font от некоторого класса кроме NSFontPanel
, используйте NSFontManager
метод класса setFontPanelFactory:
. Посмотрите Шрифты Преобразования Вручную для получения дополнительной информации об использовании системы преобразования шрифта.
Используя панель шрифта
Можно включить взаимодействие между текстовым объектом и панелью Font с помощью NSTextView
(или NSText
) метод setUsesFontPanel:
метод. Выполнение так рекомендуется для текстового представления, служащего полевым редактором, например.
Можно использовать панель Font на объектах кроме стандартных текстовых полей. NSFontManager
метод setAction:
устанавливает действие (указанный селектором), который повышен первая цепочка респондента, когда выбран новый шрифт. Селектор по умолчанию changeFont:
. Любой объект, получающий это сообщение от цепочки респондента, должен отправить a convertFont:
обменивайтесь сообщениями назад к NSFontManager
для преобразования шрифта способом, пользователь указал.
Этот пример предполагает, что существует только один выбранный шрифт:
– (void)changeFont:(id)sender |
{ |
NSFont *oldFont = [self font]; |
NSFont *newFont = [sender convertFont:oldFont]; |
[self setFont:newFont]; |
return; |
} |
Если многократные шрифты выбраны, changeFont:
должен отправить сообщения преобразования за каждым выбранным шрифтом. Это полезно для объектов, таких как табличные представления, по сути не реагирующие на сообщения от панели Font.
Работа с объектами шрифта
Компьютерный шрифт является файлом данных в формате, таком как OpenType или TrueType, содержа информацию, описывающую ряд глифов, как описано в Символах и Глифах и различной дополнительной информации, используемой в рендеринге глифа. NSFont
класс обеспечивает интерфейс для получения и установки информации о шрифтах. NSFont
экземпляр обеспечивает доступ к характеристикам и глифам шрифта. Текстовая система комбинирует символьную информацию с информацией о шрифтах для выбора глифов, используемых во время текстового расположения. Вы используете объекты шрифта путем передачи их методам, принимающим их в качестве параметра. Объекты шрифта являются неизменными, таким образом, безопасно использовать их от многократных потоков в Вашем приложении.
Вы не создаете объекты шрифта с помощью alloc
и init
методы; вместо этого, Вы используете методы такой как fontWithName:matrix:
или fontWithName:size:
искать доступный шрифт и изменить его размер или матрицу к Вашим потребностям. Если существует тот, эти методы проверяют на существующий объект шрифта с заданными характеристиками, возвращая его. Иначе, они ищут данные шрифта, которые требуют, и создают надлежащий объект. Можно также использовать дескрипторы шрифта для создания шрифтов. Посмотрите Дескрипторы Шрифта.
NSFont
также определяет много методов для указания стандартных системных шрифтов, такой как systemFontOfSize:
, userFontOfSize:
, и messageFontOfSize:
. Запрашивать размер по умолчанию на эти стандартные шрифты, передачу 0
или отрицательное число как размер шрифта. Стандартные методы системного шрифта перечислены в Запросах Изменений Стандартного шрифта.
Дескрипторы шрифта
Дескрипторы шрифта, которые инстанцируют от NSFontDescriptor
класс, обеспечьте способ описать шрифт со словарем атрибутов. Дескриптор шрифта может тогда использоваться, чтобы создать или изменить NSFont
объект. В частности можно сделать NSFont
объект от дескриптора шрифта, можно получить дескриптор от NSFont
объект, и можно изменить дескриптор и использовать его для создания нового объекта шрифта. Можно также использовать дескриптор шрифта для указания пользовательских шрифтов, предоставленных приложением.
Дескрипторы шрифта обеспечивают возможность подстановки шрифтов, которой можно частично описать шрифт путем создания дескриптора шрифта с, например, просто фамилия. Можно тогда найти все доступные шрифты в системе с соответствующим использованием фамилии matchingFontDescriptorsWithMandatoryKeys:
.
Дескрипторы шрифта могут быть заархивированы, который предпочтителен для архивации объекта шрифта, потому что объект шрифта является неизменным и обеспечивает доступ к определенному шрифту, установленному в определенной системе. Дескриптор шрифта, с другой стороны, описывает шрифт с точки зрения своих характеристик, своих атрибутов, и обеспечивает доступ во время выполнения к шрифтам, в настоящее время доступным, которые соответствуют те атрибуты.
Т.е. можно использовать дескрипторы шрифта для запросов системы для доступных шрифтов, соответствующих определенные атрибуты, и затем создающих экземпляры NSFont
соответствуя те атрибуты, такие как имена, черты, языки и другие функции. Например, можно использовать дескриптор шрифта для получения всех шрифтов, соответствующих данное имя семейства шрифтов, с помощью фамилий PostScript (как определено стандартом CSS) как показано в Перечислении 6-1.
Соответствие имени Семейства шрифтов перечисления 6-1
NSFontDescriptor *helveticaNeueFamily = |
[NSFontDescriptor fontDescriptorWithFontAttributes: |
@{ NSFontFamilyAttribute: @"Helvetica Neue" }]; |
NSArray *matches = |
[helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil]; |
matchingFontDescriptorsWithMandatoryKeys:
метод как показано возвращает массив дескрипторов шрифта для всех шрифтов Helvetica Neue в системе, такой как HelveticaNeue
, HelveticaNeue-Medium
, HelveticaNeue-Light
, HelveticaNeue-Thin
, и т.д. (Семейство шрифтов PostScript и имена семейства шрифтов для шрифтов, доступных на данной установке OS X, выведены на экран приложением Книги Шрифта в окне Font Info.)
Запросы метрик шрифта
NSFont
когда та информация доступна, определяет много методов для доступа к данным метрик шрифта. Методы такой как boundingRectForGlyph:
, boundingRectForFont
, xHeight
, и т.д. все соответствуют данным метрик стандартного шрифта. Рисунок 6-1 показывает, как метрики шрифта применяются к размерностям глифа, и Таблица 6-1 перечисляет имена методов, коррелирующие с метриками. См. различные описания метода для более определенной информации.
Метрика шрифта | Методы |
---|---|
| |
Запросы изменений стандартного шрифта
Используя методы NSFont
перечисленный в Таблице 6-2, можно запросить все изменения стандартного шрифта. Для запроса размера стандартного шрифта на стандартные шрифты можно или явно передать в размерах по умолчанию (полученный из методов класса такой как systemFontSize
и labelFontSize
), или передача в 0
или отрицательная величина.
Символы, глифы и менеджер по расположению
Символы являются концептуальными объектами, соответствующими модулям письменного языка. Обычно глиф является конкретным, представленным изображением символа. (Типографские Понятия представляют более детальное обсуждение символов и глифов.)
На английском языке часто существует непосредственное отображение между символами и глифами, но это не всегда имеет место. Например, глиф «Ф» может быть результатом двух символов, одно представление основного символа «o» и другое представление диакритического знака умляута «•». Пользователь текстового процессора может нажать клавишу со стрелкой одно время для перемещения точки вставки с одной стороны «Ф» глифа к другому; однако, текущая позиция в символьном потоке должна быть постепенно увеличена два для учета двух символов, составляющих единственный глиф.
Таким образом текстовая система должна управлять двумя связанными, но различными потоками данных: поток символов (и их атрибуты) и поток глифов, полученных из этих символов. NSTextStorage
объектно-ориентированные памяти приписанные символы, и NSLayoutManager
объектно-ориентированные памяти полученные глифы. Нахождение корреспонденции между этими двумя потоками является ответственностью менеджера по расположению. Например, когда пользователь выбирает диапазон текста, работающего с глифами, выведенными на экран на экране, менеджер по расположению должен определить, какой диапазон символов соответствует выбору.
Когда символы удалены, некоторые глифы, вероятно, придется перерисовать. Например, если пользователь удаляет символы «исключая ошибки» из слова «чувство», то «f» и «l» теперь смежны и могут быть представлены «fl» лигатурой, а не этими двумя глифами «f» и «l». NSLayoutManager
объект направляет объект генератора глифа для генерации новых глифов по мере необходимости. Как только глифы регенерированы, текст должен быть размечен и выведен на экран. Работа с NSTextContainer
возразите и другие объекты текстовой системы, менеджер по расположению определяет, где каждый глиф появляется в текстовом представлении. Наконец, текстовое представление представляет текст.
Поскольку NSLayoutManager
объект является центральным к работе текстовой системы, это также служит репозиторием информации, поделившейся различными компонентами системы. Для получения дополнительной информации о NSLayoutManager
, обратитесь к Ссылке класса NSLayoutManager и к текстовому Руководству по программированию Расположения.
Получение координат представления глифа
Расположения глифа изображаются относительно источника ограничительного прямоугольника фрагмента строки, в котором они размечаются. Для получения прямоугольника фрагмента строки глифа в его контейнерных координатах используйте NSLayoutManager
метод lineFragmentRectForGlyphAtIndex:effectiveRange:
. Тогда добавьте источник того прямоугольника к расположению глифа, возвращенного locationForGlyphAtIndex:
получить расположение глифа в контейнерных координатах.
Следующий фрагмент кода из проекта примера кода CircleView иллюстрирует этот метод.
usedRect = [layoutManager usedRectForTextContainer:textContainer]; |
NSRect lineFragmentRect = [layoutManager lineFragmentRectForGlyphAtIndex:glyphIndex |
effectiveRange:NULL]; |
NSPoint viewLocation, layoutLocation = [layoutManager |
locationForGlyphAtIndex:glyphIndex]; |
// Here layoutLocation is the location (in container coordinates) where the glyph was laid out. |
layoutLocation.x += lineFragmentRect.origin.x; |
layoutLocation.y += lineFragmentRect.origin.y; |
Работа с менеджером по шрифту
Любой объект, записывающий шрифты, которые может изменить пользователь, должен сказать менеджеру по шрифту, что - шрифт его выбора то, каждый раз, когда это становится первым респондентом и каждый раз, когда его выбор изменяется, в то время как это - первый респондент. Объект делает так путем отправки совместно используемому менеджеру по шрифту a setSelectedFont:isMultiple:
сообщение. Это должно передать в первом шрифте выбора, вместе с флагом, указывающим, существует ли больше чем один шрифт.
Менеджер по шрифту использует эту информацию для обновления панели Font и меню Font для отражения шрифта в выборе. Например, предположите, что шрифт является Helvetica Наклонные 12,0 точек. В этом случае панель Font выбирает тот шрифт и выводит на экран его имя; меню Font добавляет галочку перед своей командой Italic; если нет никакого Полужирного варианта доступного Helvetica, пункт меню Bold отключен; и т.д.
Создание менеджера по шрифту
Вы обычно устанавливаете менеджера по шрифту и Разработчика Интерфейса использования меню Font. Однако можно также сделать так программно путем получения совместно используемого менеджера по шрифту, экземпляр и наличие его создают меню стандартного шрифта во время выполнения, как в этом примере:
NSFontManager *fontManager = [NSFontManager sharedFontManager]; |
NSMenu *fontMenu = [fontManager fontMenu:YES]; |
Можно тогда добавить меню Font к меню приложения. Как только меню Font установлено, Ваше приложение автоматически получает функциональность и меню Font и панели Font.
Обработка изменений шрифта
Пользователь обычно изменяет шрифт выбора путем управления панелью Font (также названный окном Fonts) и меню Font. Эти объекты инициируют намеченное изменение путем отправки сообщения действия менеджеру по шрифту. Существует четыре изменяющих шрифт метода действия:
Первые три заставляют менеджера по шрифту запрашивать отправителя сообщения для определения, какую черту добавить или удалить, или как изменить шрифт. Последние причины менеджер по шрифту для использования настроек в панели Font для изменения шрифта. Менеджер по шрифту записывает эту информацию и использует ее в более поздних запросах для преобразования шрифтов.
Когда менеджер по шрифту получает addFontTrait:
или removeFontTrait:
сообщение, это запрашивает отправителя с a tag
сообщение, интерпретируя возвращаемое значение как маску черты для использования с convertFont:toHaveTrait:
или convertFont:toNotHaveTrait:
, как описано в Преобразовании Шрифтов Вручную. Курсив команд меню Font и Полужирный, например, имеет значения маски черты NSItalicFontMask
и NSBoldFontMask
, соответственно. Посмотрите раздел Constants в Ссылке класса NSFontManager для списка значений маски черты.
Когда менеджер по шрифту получает a modifyFont:
сообщение, это запрашивает отправителя с a tag
обменивайтесь сообщениями и интерпретирует возвращаемое значение как определенный вид преобразования для выполнения, через различные методы преобразования, описанные в Преобразовании Шрифтов Вручную. Например, кнопка, значение тега которой SizeUpFontAction
вызывает менеджера по шрифту convertFont:
метод для увеличения размера NSFont
объект передал как параметр. Посмотрите NSFontManager
метод modifyFont:
поскольку список преобразования тегирует значения.
Для modifyFontViaPanel:
, менеджер по шрифту отправляет панель a Font приложения panelConvertFont:
сообщение. Панель Font поочередно использует менеджера по шрифту для преобразования шрифта, предоставленного согласно выбору пользователя. Например, если пользователь выбирает только семейство шрифтов в панели Font (возможно, Helvetica), для то для любых шрифтов предоставлены panelConvertFont:
, только семья изменяется: Носитель Курьера 10,0 точек становятся Носителем Helvetica 10,0 точек и Курсив Времен 12,0 точек, становится Helvetica Наклонные 12,0 точек.
Менеджер по шрифту реагирует на изменяющий шрифт метод действия путем отправки a changeFont:
сообщение действия цепочка респондента. Переносящий текст объект, получающий это сообщение, должен сделать, чтобы менеджер по шрифту преобразовал шрифты в его выборе путем вызова convertFont:
для каждого шрифта и использования NSFont
объект возвратился. convertFont:
метод использует информацию, зарегистрированную изменяющим шрифт методом действия, такой как addFontTrait:
, изменение шрифта обеспечило соответственно. (Нет никакого способа явно установить изменяющее шрифт действие или черту; вместо этого, Вы используете методы, описанные в Преобразовании Шрифтов Вручную.)
Этот простой пример предполагает, что в выборе существует только один шрифт:
- (void)changeFont:(id)sender |
{ |
NSFont *oldFont = [self selectionFont]; |
NSFont *newFont = [sender convertFont:oldFont]; |
[self setSelectionFont:newFont]; |
return; |
} |
Большинство переносящих текст объектов должно отсканировать выбор для диапазонов с различными шрифтами и вызвать convertFont:
для каждого.
Преобразование шрифтов вручную
NSFontManager
определяет много методов для того, чтобы явно преобразовать определенные черты и характеристики шрифта. Таблица 6-3 перечисляет эти методы преобразования.
Каждый метод возвращает преобразованную версию шрифта, если, или исходный шрифт, если это не может быть преобразовано.
Реализация по умолчанию преобразования шрифта очень консервативна, внося изменение, только если не затронуты никакая другая черта или аспект. Например, при попытке преобразовать Helvetica Наклонные 12,0 точек путем добавления Полужирной черты, и только Полужирный Helvetica доступен, шрифт не преобразовывается. Можно создать подкласс NSFontManager
и переопределите методы преобразования для выполнения менее консервативного преобразования, возможно с помощью Helvetica, Полужирного в этом случае и теряя Наклонную черту.
В дополнение к методам преобразования шрифта, NSFontManager
определяет fontWithFamily:traits:weight:size:
создать шрифт с данным набором характеристик. Если Вы не хотите сделать подкласс NSFontManager
, можно использовать этот метод для выполнения приблизительных преобразований шрифта сами.
Установка стилей шрифтов и черт
Этот раздел показывает, как программно установить стили шрифтов, такие столь же полужирные или курсивные, и атрибуты шрифта, такие как подчеркивание, в приписанной строке.
Подчеркивание является атрибутом, который может быть легко установлен на приписанной строке, с помощью NSUnderlineStyleAttributeName
постоянный, как объяснено в Ссылке класса NSMutableAttributedString. Используйте следующий метод:
- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)aRange |
Передача NSUnderlineStyleAttributeName
для параметра имени со значением [NSNumber numberWithInt:1]
.
В отличие от подчеркивания, полужирного и курсивного, черты шрифта, таким образом, необходимо использовать менеджера по шрифту экземпляр для преобразования шрифта для имения желаемой черты, затем добавьте атрибут шрифта к непостоянной приписанной строке. Для непостоянной приписанной названной строки attributedString
, используйте следующий метод:
NSFontManager *fontManager = [NSFontManager sharedFontManager]; |
unsigned idx = range.location; |
NSRange fontRange; |
NSFont *font; |
while (NSLocationInRange(idx, range)){ |
font = [attributedString attribute:NSFontAttributeName atIndex:idx |
longestEffectiveRange:&fontRange inRange:range]; |
fontRange = NSIntersectionRange(fontRange, range); |
[attributedString applyFontTraits:NSBoldFontMask range:fontRange]; |
idx = NSMaxRange(fontRange); |
} |
Если Ваша непостоянная приписанная строка фактически NSTextStorage
объект, поместите этот код между beginEditing
и endEditing
вызовы.
Исследование шрифтов
В дополнение к преобразованию шрифтов, NSFontManager
предоставляет информацию, на которой шрифты доступны приложению и на характеристиках любого данного шрифта. availableFonts
метод возвращает массив имен всех доступных шрифтов. availableFontNamesWithTraits:
метод фильтрует доступные шрифты на основе маски черты шрифта.
Существует три метода для исследования отдельных шрифтов. fontNamed:hasTraits:
возвраты метода true
если шрифт соответствует предоставленную маску черты. traitsOfFont:
метод возвращает маску черты для данного шрифта. weightOfFont:
метод возвращает приблизительное ранжирование веса шрифта в масштабе 0–15, где 0 самый легкий вес, 5 Нормальное или Книжное начертание, 9 эквивалент Полужирного цвета, и 15 является самым тяжелым (часто называемый Черным или Крайним Черным цветом).
Настройка системы преобразования шрифта
Если необходимо настроить систему преобразования шрифта путем создания подклассов NSFontManager
или NSFontPanel
, необходимо сообщить NSFontManager
класс этого изменения с a setFontManagerFactory:
или setFontPanelFactory:
сообщение, или перед совместно используемый менеджер по шрифту или перед совместно использованная панель Font создаются. Эти методы записывают Ваш класс как тот для инстанцирования в первый раз, когда менеджера по шрифту или панель Font требуют. Можно быть в состоянии избегать использования подклассов, если все, в чем Вы нуждаетесь, должно добавить некоторые пользовательские элементы управления к панели Font. В этом случае можно вызвать NSFontPanel
метод setAccessoryView:
добавить NSView
объект ниже его браузера шрифта.
При обеспечении собственного меню Font необходимо зарегистрировать его в менеджере по шрифту, использующем setFontMenu:
метод. Менеджер по шрифту ответственен за проверку пунктов меню Font и изменение их заголовков и тегов согласно выбранному шрифту. Например, когда выбранный шрифт является Курсивом, менеджер по шрифту добавляет галочку к пункту меню Italic Font и изменяет его тег на UnitalicMask
. Ваши элементы меню Font должны использовать методы соответствующих мер и теги, как показано в Таблице 6-4.
Пункт меню Font | Действие | Тег |
---|---|---|
Курсив |
| |
Полужирный |
| |
Более тяжелый |
| |
Больше |
|
См. также следующие документы: Приписанное Строковое Руководство по программированию описывает NSAttributedString
объекты, управляющие наборами атрибутов, такими как шрифт и кернинг, связанные с символьными строками или отдельными символами. Текстовое Руководство по программированию Расположения описывает, как текстовая система Какао преобразовывает строки текстовых символов, информации о шрифтах и спецификаций страницы в строки глифов, помещенных в определенные расположения на странице, подходящей для дисплея и печати.