Рисование строк
Существует три способа составить текст программно в Какао: использование методов NSString
или NSAttributedString
, использование тех NSCell
, и использование NSLayoutManager
непосредственно. NSLayoutManager
является самым эффективным.
Используя рисующие строку удобные методы
NSString
класс имеет два удобных метода для рисования строковых объектов непосредственно в NSView
объект: drawAtPoint:withAttributes:
и drawInRect:withAttributes:
. Для строк, которым связали многократные атрибуты с диапазонами и отдельными символами, необходимо использовать NSAttributedString
. Можно нарисовать строку (в фокусируемом NSView
) с любым drawAtPoint:
или drawInRect:
метод. Эти методы разработаны для рисования мелких сумм текста или текста, который должен редко составляться. Они создают и избавляются от различных текстовых объектов поддержки, включая NSLayoutManager
, каждый раз Вы вызываете их.
Для повторного получения текста, однако, строка, получающая удобные методы, не эффективна, потому что они выполняют большую работу негласно. Например, для рисования текста Unicode необходимо сначала преобразовать символы в глифы, элементы шрифта. Генерация глифа является сложной, потому что несколько символов могут произвести единственный глиф и наоборот, в зависимости от контекста и других факторов. Кроме того, система приводит в порядок большую установку работы для преобразования глифа, и строка, получающая удобные методы, выполняет эту работу каждый раз, когда они рисуют строку. Используя менеджера по расположению непосредственно обеспечивает значительные повышения производительности, потому что это кэширует расположение глифа и информацию о размере.
Рисование текста с NSCell
NSCell
класс также обеспечивает примитивы для отображения и редактирования текста. NSCell
текстовые методы рисования используются NSBrowser
и NSTableView
. Текстовое получение NSCell
более эффективно, чем использование строковых удобных методов, потому что оно кэширует некоторую информацию, такую как размер текстового прямоугольника. Так, для отображения того же текста неоднократно, NSCell
работы хорошо, но для самого эффективного дисплея произвольной текстовой строки, используют NSLayoutManager
непосредственно.
Рисование текста с NSLayoutManager
Если Вы используете NSTextView
класс для отображения текста, или путем перетаскивания текста просматривает объект от палитры Interface Builder Data или создания текстового представления программно использование NSTextView
метод initWithFrame:
метод, Какао автоматически создает NSLayoutManager
экземпляр для рисования текста. Если Вы создаете текстовое представление с помощью NSTextView
initWithFrame:textContainer:
метод, однако, или если необходимо составить текст непосредственно в другой тип NSView
объект, необходимо создать NSLayoutManager
явно.
Использовать NSLayoutManager
для рисования текстовой строки непосредственно в представление необходимо создать и инициализировать три основных компонента непредставления текстовой системы. Сначала создайте NSTextStorage
возразите для содержания строки. Тогда создайте NSTextContainer
объект описать геометрическую область для текста. Тогда создайте NSLayoutManager
возразите и сцепите три объекта вместе путем добавления менеджера по расположению к текстовому объекту хранения и добавления текстового контейнера к менеджеру по расположению. Код в Перечислении 1, которое могло находиться в представлении initWithFrame:
метод, иллюстрирует эту процедуру.
Создание перечисления 1 и конфигурирование текстовых объектов непредставления
NSTextStorage *textStorage = [[NSTextStorage alloc] |
initWithString:@"This is the text string."]; |
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; |
NSTextContainer *textContainer = [[NSTextContainer alloc] init]; |
[layoutManager addTextContainer:textContainer]; |
[textContainer release]; |
[textStorage addLayoutManager:layoutManager]; |
[layoutManager release]; |
Можно выпустить текстовый контейнер, потому что менеджер по расположению сохраняет его, и можно выпустить менеджера по расположению, потому что текстовый объект хранения сохраняет его.
Для рисования глифов непосредственно в представлении можно использовать NSLayoutManager
метод drawGlyphsForGlyphRange:
в представлении drawRect:
метод. Однако необходимо сначала преобразовать диапазон символов, Вы хотите вовлечь диапазон глифа. Если необходимо выбрать поддиапазон текста в текстовом объекте хранения, можно использовать glyphRangeForCharacterRange:actualCharacterRange:
метод. Если Вы хотите нарисовать всю строку в текстовом объекте хранения, используйте glyphRangeForTextContainer:
метод как в Перечислении 2 (который использует layoutManager
имя переменной от Перечисления 1).
Перечисление 2 , Получающее глифы непосредственно в представлении
NSRange glyphRange = [layoutManager |
glyphRangeForTextContainer:textContainer]; |
[self lockFocus]; |
[layoutManager drawGlyphsForGlyphRange: glyphRange atPoint: rect.origin]; |
[self unlockFocus]; |
Строковое получение и способы поведения наборного устройства
Существуют различия среди трех способов Какао составить текст относительно поведения наборного устройства, описанного в Способах поведения Наборного устройства и Версиях. По умолчанию, рисующие строку удобные методы и NSCell
объекты предоставляются использованием Набора Приложения NSTypesetterBehavior_10_2_WithCompatibility
, тогда как NSLayoutManager
использование объектов NSTypesetterLatestBehavior
. Важно использовать то же поведение наборного устройства когда и измеряющийся и представляющий текст, избежать различий в расстоянии между абзацами, межстрочном интервале и главной обработке отступа.
В случаях, где необходимо измерить текст один путь и представить его другой, установить поведение наборного устройства соответствовать использование setTypesetterBehavior:
метод, определенный NSLayoutManager
и NSTypesetter
. Например, если необходимо использовать NSLayoutManager
возразите для измерения текста, и удобство представляют методы рисования в виде строки нарисовать его, изменить поведение наборного устройства менеджера по расположению на NSTypesetterBehavior_10_2_WithCompatibility
.