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

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

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

фреймы глифов с использованием boundingRectForGlyphRange:inTextContainer

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

Zapfino для глифа с использованием boundingRectForGlyphRange:inTextContainer

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

Спасибо.


person jlmendezbonini    schedule 13.02.2014    source источник
comment
так устроен шрифт. какой результат вы получили в случае шрифта SnellRoundhand или любых других курсивных/наклонных шрифтов?   -  person holex    schedule 14.08.2014


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

person Community    schedule 21.08.2014