Разметка текста вдоль произвольного пути
Текстовая система Какао обычно размечает текст в горизонтальных строках в текстовом представлении. Однако также возможно использовать просто текстовые объекты, должен был сохранить символы и генерировать глифы при ручном вычислении заключительных позиций глифа и рисовании глифов самостоятельно.
Для разметки текста вдоль произвольного пути необходимо использовать три основных, текстовых объекта непредставления: NSTextStorage
содержать текст, NSTextContainer
смоделировать область, в которой текст размечается, и NSLayoutManager
генерировать глифы и информацию макета. Наконец Вы рисуете глифы в пользовательском NSView
объект.
Сначала Вы создаете и инициализируете экземпляры текстового хранения, текстового контейнера и менеджера по расположению. Вы инициализируете текстовый контейнер со строкой текста, который будет размечен. Тогда Вы сцепляете объекты вместе: текстовый объект хранения сохраняет ссылку на менеджера по расположению, и менеджер по расположению сохраняет ссылку на текстовый контейнер. Перечисление 1, которое могло находиться в методе инициализации для пользовательского NSView
возразите, что выводит на экран текст, иллюстрирует этот процесс.
Создание перечисления 1 и конфигурирование текстовых объектов непредставления
NSTextStorage *textStorage; |
NSLayoutManager *layoutManager; |
NSTextContainer *textContainer; |
textStorage = [[NSTextStorage alloc] initWithString:@"This is the string of text in the text storage."]; |
layoutManager = [[NSLayoutManager alloc] init]; |
textContainer = [[NSTextContainer alloc] init]; |
[layoutManager addTextContainer:textContainer]; |
[textContainer release]; |
[textStorage addLayoutManager:layoutManager]; |
[layoutManager release]; |
Причина Вы «добавляете» эти ссылки, вместо того, чтобы «установить» их, состоит в том, потому что у менеджера по расположению могут быть многократные текстовые контейнеры, и текстовый объект хранения может иметь многократных менеджеров по расположению. Также отметьте импликации управления памятью этой процедуры: Поскольку менеджер по расположению сохраняет текстовый контейнер, и текстовое хранение сохраняет менеджера по расположению, можно выпустить их, как только Вы соединяете объекты. Однако необходимо явно выпустить текстовый объект хранения в Вашем dealloc
метод.
Скажите менеджеру по расположению не использовать экранные шрифты, потому что они не масштабируются или вращаются должным образом (по умолчанию, экранные шрифты позволяются):
[layoutManager setUsesScreenFonts:NO]; |
Затем, вынудите менеджера по расположению генерировать глифы для символов в текстовом объекте хранения и иметь его, вычисляют позиции глифа, размеченные в простом, прямоугольном контейнере. Вы тогда преобразовываете позиции и вызываете менеджера по расположению для рисования глифов. Это может быть сделано в представлении drawRect:
метод.
Следующее сообщение вызывает расположение и возвращает глифы для символьной строки в текстовом объекте хранения:
NSRange glyphRange = [layoutManager |
glyphRangeForTextContainer:textContainer]; |
Код в Перечислении 2 делает фактическое получение.
Перечисление 2 , Получающее строку
NSGraphicsContext *context = [NSGraphicsContext currentContext]; |
NSAffineTransform *transform = [NSAffineTransform transform]; |
[transform rotateByDegrees:30.0]; |
[context saveGraphicsState]; |
[transform concat]; |
[self lockFocus]; |
[layoutManager drawGlyphsForGlyphRange:glyphRange |
atPoint:NSMakePoint(50.0, 50.0)]; |
[self unlockFocus]; |
[context restoreGraphicsState]; |
Этот фрагмент просто поворачивает графический контекст 30 градусов против часовой стрелки, прежде чем это попросит, чтобы менеджер по расположению нарисовал глифы, но другой алгоритм мог использоваться для вычисления пути более сложного макета. Это обсуждение упрощает метод для концентрации на взаимодействиях с менеджером по расположению.
Пример CircleView обеспечивает исходный код для приложения, иллюстрирующего метод, но делающего это более устойчивым способом. CircleView вычисляет позицию и рисует каждый глиф индивидуально.