Рисование строк

Существует три способа составить текст программно в Какао: использование методов 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.