Установите какой-либо атрибут в строке атрибута, который не будет влиять на отображение, но заставит его быть размеченным как отдельный прогон глифа, а затем используйте CoreText для разметки строки
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
Теперь вы будетепридется искать в кадре, чтобы найти соответствующий кусок текста.Получите массив CTLineRef
s с CTFrameGetLines()
.
. Итерируйте по массиву, проверяя, было ли касание в этой строке, проверяя, находится ли он внутри прямоугольника, возвращенного CTLineGetImageBounds()
.Если это так, то теперь просмотрите глифы в строке.
Опять же, вы можете получить массив CTRunRef
s с CTLineGetGlyphRuns()
.Проверьте, был ли касание в пределах прогона глифа с помощью CTRunGetImageBounds()
, и, если это так, вы можете найти диапазон индексов в исходной атрибутивной строке, которому соответствует прогон глифа с CTRunGetStringIndices()
.