Основной текст - выбрать текст в iPhone? - PullRequest
3 голосов
/ 02 ноября 2011

Мне нужно визуализировать форматированный текст с использованием Core Text на мой взгляд (простое форматирование, несколько шрифтов в одной строке текста и т. Д.).Мне интересно, может ли текст, отображаемый таким образом, быть выбран пользователем с помощью (стандартная функция копирования / вставки)?

1 Ответ

24 голосов
/ 13 июня 2012

Я реализовал выделение текста в CoreText. Это действительно тяжелая работа ... Но это выполнимо.

В основном вы должны сохранить все CTLine ректы и оригиналы, используя CTFrameGetLineOrigins (1) , CTLineGetTypographicBounds (2) , CTLineGetStringRange (3 ) и CTLineGetOffsetForStringIndex (4) .

Прямоугольник линии можно рассчитать с использованием начала координат (1) , подъема (2) , снижения (2) и смещения (3 ) (4) , как показано ниже.

lineRect = CGRectMake(origin.x + offset, 
                      origin.y - descent, 
                      offset, 
                      ascent + descent);

После этого вы можете проверить, какая линия имеет точку касания, зацикливая линии (всегда помните, что CoreText использует обратные координаты Y).

Зная линию, которая имеет точку касания, вы можете узнать букву, которая находится в этой точке (или ближайшую букву), используя CTLineGetStringIndexForPosition.

Вот один скриншот.

selecting text drawn with CoreText

Для этой лупы я использовал код , показанный в этом посте .

Edit: Чтобы нарисовать выделение синего фона, вы должны нарисовать прямоугольник, используя CGContextFillRect. К сожалению, в NSAttributedString.

нет цвета фона.
...