2014-02-13 2 views
14

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

Использование не кажется NSLayoutManager-х boundingRectForGlyphRange:inTextContainer: вернуть глиф ограничивающей коробки, что именно:

glyph frames using boundingRectForGlyphRange:inTextContainer

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

Zapfino f glyph using boundingRectForGlyphRange:inTextContainer

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

Спасибо.

+0

Именно так разработан шрифт. какой результат вы получили в случае шрифта _SnellRoundhand_ или любых других курсивных/наклонных шрифтов? – holex

ответ

0

selected answer в сообщении вы ссылаетесь на, по-видимому solves this problem for Zapfino.

+5

Они решают проблему, но используют Core Text. Я ищу решение с помощью TextKit. Я действительно разговаривал с инженером Core Text во время WWDC, и мы согласились, что это ошибка в TextKit. Я отправил этот отчет об ошибке: http://openradar.appspot.com/radar?id=6228264280391680 – jlmendezbonini

+0

Я согласен с @jlmendezbonini, должен быть TextKit. Эта проблема еще более очевидна с текстом «Право налево» и нахождением границ слов. – ugiflezet

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 является приближением ширины буквы, рассчитанной как дельта между двумя последовательными отправными точками.

+0

Можете ли вы подробнее рассказать? Как только у вас есть позиция, что вы используете для вычисления правильности глифа? – jlmendezbonini

+0

да, я обновил свой ответ – ugiflezet

Смежные вопросы