Подтвердить что ты не робот

Использование NSLayoutManager для расчета кадров для каждого символа

В этой теме Core Text вычисляет буквенный фрейм в iOS, они смогли точно рассчитать кадр каждого глифа с помощью Core Text. Заключительные выпуклости прекрасно обнимают собственно рисованные глифы.

Использование NSLayoutManager boundingRectForGlyphRange:inTextContainer:, похоже, не возвращает граничные рамки глифов, которые точно:

glyph frames using boundingRectForGlyphRange:inTextContainer

И возвращенные прямоугольники не полностью охватывают более сложные шрифты (пример Zapfino):

Zapfino f glyph using boundingRectForGlyphRange:inTextContainer

Кто-нибудь знает, как реплицировать результаты вышеупомянутого обсуждения, не входя в Core Text в приложениях iOS 7?

Спасибо.

4b9b3361

Ответ 1

Я нашел решение этой проблемы или, по крайней мере, своего рода

Проблема: boundingRectForGlyphRange результаты отключены в случае RTL-текста.

Таким образом, в случае RTL-текста обнаруживается только:

Использование метода NSLayoutManager locationForGlyphAtIndex для каждой буквы в диапазоне. Это начальные точки каждого глифа в диапазоне. Используя эти точки, я правильно настраиваю boundingRect.

Вот его схема:

CGPoint endPoint = ((NSValue *)pointsOfGlyps.firstObject).CGPointValue;
CGPoint startPoint = ((NSValue *)pointsOfGlyps.lastObject).CGPointValue;
boundingRect.origin.x =  startPoint.x;
boundingRect.size.width = endPoint.x - startPoint.x + letterWidth;

letterWidth - это приблизительная ширина буквы, рассчитанная как дельта между двумя последовательными начальными точками.