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

Я пытаюсь найти границы строки текста в Core Text. Для простоты предположим, что он состоит из одного символа. На данный момент я использую следующий метод:

line = CTLineCreateWithAttributedString(attrString);
rect = CTLineGetImageBounds(line, context);

В большинстве случаев он работает, но для некоторых символов, таких как математический курсив d (Unicode: 0x1D451) или математический курсив q (Unicode: 0x1D45E), ширина немного короче.

Я пробовал использовать CTLineGetTypographicBounds() или CTFramesetterSuggestFrameSizeWithConstraints, но они тоже не помогли (я думаю, они используют продвижение глифа, чтобы найти ширину, а не его графическую ширину). Поскольку сам шрифт не курсивный, я также не могу использовать наклонный угол для исправьте это.

Я попытался получить доступ к глифам напрямую и с помощью CTFontCreatePathForGlyph(), но не смог, поскольку CGGlyph и UniChar являются 16-битными, а мне нужны 32-битные символы.

Кто-нибудь знает, делаю ли я что-нибудь не так? Если да, то каков правильный путь?

Обновление:

Чтобы убедиться, что проблема не связана со шрифтом, я использовал другие шрифты. Проблема существует даже для символов ASCII в Arial Italic.

Обновление:

Игнорируйте мое предыдущее обновление! Оказывается, это (проблема с Arial Italic) была моя собственная ошибка. Однако первая проблема все еще актуальна.


person mohsenr    schedule 05.05.2010    source источник


Ответы (2)


Судя по отчету об ошибке, который я сделал, очевидно, что это проблема CoreText, возникающая в редких случаях. Сообщу вам, как только найду исправление.

Обновление: 15 марта 2012 г.

Я забыл обновить это раньше, но это исправлено. Исправление есть в OS X Lion / iOS 5.

person mohsenr    schedule 31.05.2010

Насколько я могу судить, правильную функцию использовать CTLineGetImageBounds. Я предлагаю заполнить отчет об ошибке в RadarWeb.

person Peter Hosey    schedule 08.05.2010
comment
Я только что зарегистрировал ошибку. Дам тебе знать, если я что-нибудь услышу. - person mohsenr; 08.05.2010