Я реализовал выделение текста в 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](https://i.stack.imgur.com/El9qB.png)
Для этой лупы я использовал код , показанный в этом посте .
Edit:
Чтобы нарисовать выделение синего фона, вы должны нарисовать прямоугольник, используя CGContextFillRect
. К сожалению, в NSAttributedString
.
нет цвета фона.