Существует статья под названием Низкоуровневая отрисовка текста от Ohmu , которая довольно широко освещает эту проблему. Я пробовал этот код и могу подтвердить, что он работает.
Тем не менее, он использует Core Text, поэтому рендеринг, вероятно, не совсем такой, как у UILabel
. Кроме того, образец статьи имеет дело только с одной строкой. Чтобы расширить его до нескольких строк, вы должны настроить полную систему Core Text. Вместо:
CTLineRef line = CTLineCreateWithAttributedString( attStr ) ;
Вам необходимо настроить CTFramesetterRef
(CTFramesetterCreateWithAttributedString
) и CTFrameRef
(CTFramesetterCreateFrame
), как описано в Руководстве по программированию основного текста. Затем вы можете получить все строки в кадре с помощью CTFrameGetLines()
.
Затем вы обернули бы цикл for
в примере статьи:
CFArrayRef runArray = CTLineGetGlyphRuns(line);
// for each RUN
for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++)
с другим циклом, который повторяется по всем строкам. Внутреннее ядро петли должно быть идентичным.
Образец статьи создает графический контекст и добавляет пути для отдельных глифов к пути этого контекста, но вы также можете легко создать CGMutablePathRef
или UIBezierPath
и добавить пути к одному глифу к этому объекту.
Одна вещь, которая не на 100% понятна мне без тестирования, это как отрегулировать вертикальное положение глифов на последнем пути. Возможно, вам придется вызвать CTFrameGetLineOrigins()
, чтобы получить позицию каждой строки и добавить эту позицию к каждому отображаемому глифу (возможно, после преобразования его в текстовую матрицу).