Базовый текстовый обзор
Базовый текст является усовершенствованной, низкоуровневой технологией для разметки текста и обработки шрифтов. Базовый текст работает непосредственно с Core Graphics (CG), также известной как Кварц, который является высокоскоростным механизмом рендеринга графики, обрабатывающим двумерную обработку изображений на самом низком уровне в OS X и iOS.
Базовый текст посредничает между текстовым расположением и поддержкой шрифта, предоставленной высокоуровневыми платформами, и низкоуровневый Кварц возможностей обеспечивает для всего текста и платформ шрифта. Кварцевая платформа реагирует на глифы и их позиции. Базовый текст знает, как символы отображаются на шрифты и его факторы в информации о стилях, метриках шрифта и других атрибутах, прежде чем он вызовет в Кварц для рендеринга текста. Кварц является единственным способом нарисовать глифы на фундаментальном уровне, и, потому что Базовый текст предоставляет все данные в форме, непосредственно применимой Кварцем, результатом является высокоэффективный текстовый рендеринг.
Базовым текстом является независимый от платформы API на базе С
Базовый текстовый API почти идентичен на iOS и OS X, несмотря на то, что версия OS X обеспечивает более богатый набор управления шрифтом APIs, включая непостоянные наборы шрифта. Однако существуют различия между UIKit и AppKit, который необходимо рассмотреть при портировании кода между платформами. Например, у Вас должен быть Кварц графический контекст для рендеринга Ядра сгенерированные текстом глифы, и Вы получаете графический контекст по-другому на каждой платформе. Представление, которое Вы вовлекаете в iOS, является a UIView
подкласс в iOS и NSView
подкласс в OS X. И необходимо знать это a CGRect
объект передается в UIView
drawRect:
метод, в то время как версия OS X drawRect:
передается NSRect
объект. (Можно использовать NSRectToCGRect
функция в OS X для преобразования переданного - в NSRect
возразите против a CGRect
объект, требуемый как Базовый текстовый параметр функции.)
Графический контекст, возвращенный UIView
функция UIGraphicsGetCurrentContext
зеркально отражается относительно неизмененного Кварца графический контекст (т.е. источник контекста, возвращенного UIView
в верхнем левом углу), таким образом, необходимо повторно зеркально отразить графический контекст в iOS, но не в OS X. См. Перечисление 2-1 для примера кода этого метода.
Базовый текст использует системные типы данных и службы по мере возможности, и Вы используете те же соглашения, принадлежащие другим базовым платформам и в OS X и в iOS. Например, Базовый текст использует Базовые объекты Основы для многих параметров ввода и вывода, таким образом, можно сохранить их в Базовых классах набора Основы. Другие объекты, обработанные Базовым текстом такой как CGPath
объекты предоставлены Базовой Графической платформой.
Базовые текстовые объекты являются языком C непрозрачные типы
Многие низкоуровневые библиотеки в OS X и iOS записаны в плоскости К для скорости и простоты. При работе с Базовым текстом Вы используете ряд C функции такой как CTFramesetterCreateWithAttributedString
и CTFramesetterCreateFrame
вместо классов Objective C и методов.
Базовый текст непрозрачные типы
Базовый текстовый механизм расположения часто работает с приписанными строками (CFAttributedStringRef
) и графические контуры (CGPathRef
). Объект приписанной строки инкапсулирует строку, поддерживающую отображаемый текст, и включает свойства (или «атрибуты»), которые определяют стилистические аспекты символов в строке — например, шрифт и цвет. Наборный механизм в Базовом тексте использует информацию в приписанной строке для выполнения преобразования символа к глифу.
Графический контур определяет форму кадра текста. В OS X v10.7 и iOS 3.2 и позже, путь может быть непрямоугольным.
Ссылочный тип CFAttributedString, CFAttributedStringRef
, бесплатный соединенный мостом с его дубликатом Основы, NSAttributedString
. Это означает, что Базовый тип Основы является взаимозаменяемым в вызовах функции или вызовах метода с соединенным мостом объектом Основы. Поэтому в методе, где Вы видите NSAttributedString *
параметр, можно передать в a CFAttributedStringRef
, и в функции, где Вы видите a CFAttributedStringRef
параметр, можно передать в NSAttributedString
экземпляр. (Вы, возможно, должны бросить один тип к другому для подавления предупреждений компилятора.) Это также применяется к конкретным подклассам NSAttributedString
.
Атрибуты являются парами ключ/значение, определяющими характеристики стиля символов в строке, сгруппированных в диапазонах, совместно использующих те же атрибуты. Сами атрибуты переданы в приписанные строки и получены от них, с помощью объектов CFDictionary. Для применения стиля к выполненному глифу (объект CTRun) создайте объект CFDictionary содержать атрибуты, которые Вы хотите применить, затем создать приписанную строку, передавая словарь в качестве параметра. Или, можно применить атрибуты к уже существующему объекту CFMutableAttributedString. Несмотря на то, что CFDictionaryRef
и NSDictionary
бесплатный соединенный мостом, отдельные объекты атрибута, хранившие в словаре, могут не быть.
Базовые Текстовые объекты во время выполнения формируют иерархию, как показано на рисунке 1-1. Наверху этой иерархии объект framesetter (CTFramesetterRef
). С приписанной строкой и графическим контуром, как введено, framesetter генерирует один или несколько кадров текста (CTFrameRef
). Каждый объект CTFrame представляет абзац.
Для генерации кадров framesetter вызывает объект наборного устройства (CTTypesetterRef
). Поскольку это размечает текст в кадре, framesetter применяет стили абзаца к нему, включая такие атрибуты как выравнивание, позиции табуляции, межстрочный интервал, добавление отступа и повреждающий строку режим. Наборное устройство преобразовывает символы в приписанной строке к глифам и вмещает те глифы в строки, заполняющие текстовую рамку.
Каждый объект CTFrame содержит строку абзаца (CTLine) объекты. Каждый объект линии представляет строку текста. Объект CTFrame может содержать просто единственный длинный объект CTLine, или он мог бы содержать ряд строк. Объекты линии создаются наборным устройством во время framesetting работы и, как кадры, могут привлечь себя непосредственно в графический контекст.
Каждый объект CTLine содержит массив выполненного (CTRun) глифа объекты. Выполненный глиф является рядом последовательных глифов, совместно использующих те же атрибуты и направление. Наборное устройство создает выполнения глифа, поскольку оно продолжает линии от символьных строк, атрибутов и объектов шрифта. Это означает, что строка создается из одного или более выполнений глифов. Выполнения глифа могут вовлечь себя в графический контекст при желании несмотря на то, что у большинства клиентов нет потребности взаимодействовать непосредственно с выполнениями глифа.
Объекты шрифта
Шрифты оказывают помощь в разметке глифов относительно друг друга и используются для установления текущего шрифта при рисовании в графическом контексте. Непрозрачный тип Базового Шрифта текста, CTFont, является определенным экземпляром шрифта, инкапсулирующим большую информацию. Его ссылочный тип, CTFontRef
, бесплатный соединенный мостом с UIFont
в iOS и NSFont
в OS X. При создании объекта CTFont Вы обычно указываете (или используйте значение по умолчанию), размер точки и матрица преобразования, дающая экземпляру шрифта определенные характеристики. Можно тогда запросить объект шрифта для многих видов информации о шрифте в том определенном размере точки, таких как отображение символа к глифу, кодировки, данные метрики шрифта и данные глифа, среди прочего. Метрики шрифта являются параметрами, такими как подъем, спуск, продвижение, высота прописной буквы, x-высота, и т.д. Данные глифа включают параметры, такие как усовершенствования глифа и ограничительные прямоугольники.
Базовые объекты Шрифта текста являются неизменными, таким образом, они могут использоваться одновременно многократными операциями, рабочими списками или потоками. Существует много способов создать объекты шрифта. Предпочтительный метод от использования дескриптора шрифта CTFontCreateWithFontDescriptor
. Можно также использовать много преобразований APIs, в зависимости от того, с чего необходимо запустить. Например, можно использовать имя PostScript гарнитуры (CTFontCreateWithName
) или Базовая Графическая ссылка шрифта (CTFontCreateWithGraphicsFont
). Существует также CTFontCreateUIFontForLanguage
, который создает ссылку для шрифта пользовательского интерфейса для приложения в локализации, Вы используете.
Базовые ссылки Шрифта текста обеспечивают, сложный, автоматический механизм замены шрифтов вызвал расположение каскадом шрифта, выбирающее надлежащий шрифт для заменения отсутствующий шрифт при принятии во внимание черт шрифта. Расположение каскадом шрифта основывается на каскадных списках, которые являются массивами упорядоченных дескрипторов шрифта. Существует каскадный список системного значения по умолчанию (который является полиморфным, на основе установки языка пользователя и текущего шрифта), и каскадный список шрифта, указанный во время создания шрифта. Используя информацию в дескрипторах шрифта, каскадный механизм может соответствовать шрифты согласно стилю, а также соответствию символов. CTFontCreateForString
функционируйте каскадные списки использования для выбора надлежащего шрифта для кодирования данной строки. Чтобы указать и получить каскадные списки шрифта, используйте kCTFontCascadeListAttribute
свойство.
Дескрипторы шрифта
Дескрипторы шрифта, представленные CTFontDescriptor непрозрачный тип, обеспечивают механизм для описания шрифта полностью из словаря атрибутов и простого в использовании средства подстановки шрифтов для создания новых шрифтов. Можно сделать объект шрифта из дескриптора шрифта, можно получить дескриптор от объекта шрифта, и можно изменить дескриптор и использовать его для создания нового объекта шрифта. Вы можете частично описать шрифт путем создания дескриптора шрифта с, например, просто фамилия или вес, и затем можете найти все шрифты в системе, соответствующие данную черту. CTFontDescriptorRef
тип бесплатный соединенный мостом к UIFontDescriptor
в iOS и NSFontDescriptor
в OS X.
Вместо того, чтобы иметь дело со сложной матрицей преобразования, можно вместо этого создать словарь атрибутов шрифта, включающих такие свойства как имя PostScript, семейство шрифтов и стиль и черты (например, полужирный или курсивный) как объект CTFontDescriptor. Можно использовать дескриптор шрифта для создания объекта CTFont. Дескрипторы шрифта могут быть сериализированы и сохранены в документе для обеспечения персистентности для шрифтов. Рисунок 1-2 иллюстрирует систему шрифта с помощью дескриптора шрифта для создания определенного экземпляра шрифта.
Можно думать о дескрипторах шрифта как о запросах в систему шрифта. Можно создать дескриптор шрифта с неполной спецификацией, т.е. с один или всего несколько значений в словаре атрибута, и система выберет самый надлежащий шрифт от доступных. Например, если Вы указываете словарь черт с a, при создании запроса с помощью дескриптора для имени семьи со стандартными поверхностями (нормальный, полужирный, курсивный, полужирный курсив), не указывая, что любые черты соответствовали бы все поверхности в семье, но kCTFontTraitsAttribute
из kCTFontTraitBold
, результаты далее сужены от всей семьи его элементам, удовлетворяющим полужирную черту. Система может дать Вам полный список дескрипторов шрифта, соответствующих Ваш запрос через CTFontDescriptorCreateMatchingFontDescriptors
.
В iOS 6.0 и позже, приложения могут загрузить по требованию доступные шрифты, не установленные с помощью CTFontDescriptorMatchFontDescriptorsWithProgressHandler
функция. Шрифты загрузили этот путь, не установлены постоянно, и система может удалить их при определенных обстоятельствах. Шрифты, доступные для загрузки, перечислены в как «Дополнительная информация» в iOS 6: Список шрифтов и iOS 7: Список шрифтов. DownloadFont (в Библиотеке Разработчика iOS) демонстрирует метод загрузки. Загрузка шрифтов по требованию является ненужной в OS X, потому что все доступные шрифты установлены с системой.
Наборы шрифта
Наборы шрифта являются группами дескрипторов шрифта, взятых в качестве отдельного объекта. Набор шрифта представлен CTFontCollection непрозрачный тип. Наборы шрифта обеспечивают возможности перечисления шрифта, доступа к наборам глобального и пользовательского шрифта и доступа к дескрипторам шрифта, включающим набор. Можно, например, создать набор шрифта всех шрифтов, доступных в системе путем вызова CTFontCollectionCreateFromAvailableFonts
, и можно использовать набор для получения массива всех задействованных дескрипторов шрифта.