Получите ограничивающий прямоугольник строки с помощью NSLayoutManager

#objective-c #bounding-box #nslayoutmanager

#цель-c #ограничивающий прямоугольник #nslayoutmanager #objective-c

Вопрос:

У меня есть большое количество уникальных строк, для которых я хочу вычислить их ограничивающий прямоугольник, когда они будут расположены в бесконечно большом прямоугольнике. В настоящее время я использую один NSTextStorage / NSLayoutManager и перебираю все строки, собирая прямоугольники:

 // setup NSTextStorage and its NSLayoutManager, NSTextContainer
...

forall (NSAttributedString *astring in ...)
{
    // put string into textstorage
    [textStorage setAttributedString:astring];

    // trigger glyph generation and layout
    [textContainer setContainerSize: NSMakeSize (CGFLOAT_MAX, CGFLOAT_MAX)];
    [layoutManager ensureLayoutForTextContainer: textContainer];

    // finally get the bounding box
    NSRect boundingBox = [layoutManager usedRectForTextContainer: textContainer];
    ...
}
  

Вопрос в том: возможно ли ускорить вычисление, учитывая, что строки не нужно рисовать? Меня интересуют только ширина и высота прямоугольника.

Ответ №1:

Просто отвечаю на это сам после нескольких дней тестирования: нет, к сожалению, более быстрого способа с использованием layout-manager нет. Использование CoreText кажется тоже примерно в два раза быстрее, но у CoreText самого по себе есть некоторые неприятные проблемы.