Вычисление текстовой высоты

Могут быть времена, когда необходимо знать высоту блока текста, сформированного текстовой строкой после того, как это размечается в области fixed-width. NSLayoutManager класс может сделать это очень просто. Эта статья иллюстрирует метод, реализованный в единственной функции.

Основной метод для вычисления текстовой высоты использует три основных компонента непредставления текстовой системы: NSTextStorage, NSTextContainer, и NSLayoutManager. Текстовый объект хранения содержит строку, которая будет измерена; текстовый контейнер указывает ширину области расположения; и менеджер по расположению делает расположение и возвращает ширину.

Для установки текстовой системы для вычисления Вам нужна текстовая строка, которая будет измерена, шрифт для строки и ширина для области, смоделированной текстовым контейнером. Можно передать эти значения в функцию с объявлением, такие как следующее:

float heightForStringDrawing(NSString *myString, NSFont *myFont,
    float myWidth);

Имена параметра в объявлении функции появляются как переменные в следующих фрагментах кода, определяющих организацию метода.

Во-первых, Вы инстанцируете необходимых текстовых объектов и сцепляете их вместе. Вы используете определяемый инициализатор для текстового объекта хранения, берущего указатель строки в качестве параметра. Аналогично, определяемый инициализатор контейнера текста берет контейнерный размер в качестве своего параметра. Вы устанавливаете контейнерную ширину в свою желаемую ширину и устанавливаете высоту в произвольно большое значение, как показано в следующем фрагменте кода:

NSTextStorage *textStorage = [[[NSTextStorage alloc]
        initWithString:myString] autorelease];
NSTextContainer *textContainer = [[[NSTextContainer alloc]
        initWithContainerSize: NSMakeSize(myWidth, FLT_MAX)] autorelease];
NSLayoutManager *layoutManager = [[[NSLayoutManager alloc] init]
        autorelease];

Как только текстовые объекты создаются, можно сцепить их вместе:

[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];

Вы не должны выпускать текстовый контейнер и менеджера по расположению, потому что Вы добавили их к пулу автовыпуска во время инициализации. Затем, установите шрифт путем добавления атрибута шрифта к диапазону всей строки в текстовом объекте хранения. Установите дополнение фрагмента строки в 0 получить точное измерение ширины. (Дополнение используется в макете страницы для предотвращения текста в текстовом контейнере от примыкания слишком близко к другим элементам на странице, таким как графика.)

[textStorage addAttribute:NSFontAttributeName value:myFont
        range:NSMakeRange(0, [textStorage length])];
[textContainer setLineFragmentPadding:0.0];

Наконец, потому что менеджер по расположению выполняет расположение лениво, по требованию, необходимо вынудить его разметить текст, даже при том, что Вам не нужен диапазон глифа, возвращенный этой функцией. Тогда можно просто спросить менеджера по расположению по высоте прямоугольника, занятого положенным текстом и, предположив, что этот код находится в реализации функции, возвратите значение:

(void) [layoutManager glyphRangeForTextContainer:textContainer];
return [layoutManager
        usedRectForTextContainer:textContainer].size.height;