UIFont и диакритические знаки - PullRequest
2 голосов
/ 03 августа 2010

Я пишу приложение для iPhone, которое должно отображать текст i18n, содержащий диакритические знаки (тильды, акценты и т. Д.). Apple предоставляет класс UIFont , который можно использовать для получения начального, восходящего, спуска и т. Д. Данной комбинации гарнитуры / шрифта и размера

Проблема в том, что эта информация не точно отражает диакритические знаки. В частности, диакритические знаки в заглавных буквах часто превышают lineHeight (свойство UIFont, ранее известное как ведущий).

Та же проблема существует во всех рамках, т. Е. NSString: sizeWithFont имеет ту же проблему.

Мне нужно знать истинную ограничивающую рамку для текста, поскольку я использую OpenGL, у которого нет поддержки рисования текста и, следовательно, требуется рендеринг текста в текстуру.

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

1 Ответ

2 голосов
/ 03 августа 2010

Это невозможно с NSString, так как он просто возвращает размер. Вы можете попробовать CoreText, который поддерживает возврат ограничивающих рамок, но это немного излишне.

Это трудная проблема, когда Unicode поддерживает такие вещи, как è̀̀̀ (см. Также: zalgo); вещи могут рендериться выше вершины линии, поэтому вы не можете просто рисовать символы. Некоторые API для рисования текста заставляют вас задавать базовую линию и дают вам ограничивающий прямоугольник, чтобы вы могли получать как восходящие, так и спусковые устройства, но UIKit не делает этого.

Тогда у вас есть сумасшедшие курсивные шрифты со случайным огромным подъемом. Непонятно, как с этим справиться.

Ленивый способ - рендерить текстуру с полями сверху и снизу (0,5 строки? 1 строка?) И не слишком заботиться о дополнительных издержках некоторых прозрачных пикселей.

Я не слишком много смотрел на CoreText, но он не выглядит особенно многообещающим.

...