(В вашем связанном посте есть ссылка на пример проекта кода, который действительно содержит полезный пример кода, но я также опишу для вас процесс здесь.)
Короче говоря, вам нужно будет использовать Core Text, который представляет собой усовершенствованную платформу Apple для обработки текста на основе C, которая поддерживает все сложные текстовые макеты в iOS и OS X.
Полный код будет несколько сложным, но основные методы, на которые вам стоит обратить внимание:
CTFramesetterCreateWithAttributedString() — используйте это в сочетании с NSAttributedString, который вы получите из текста вашей метки — для создания фреймсеттера
CTFramesetterCreateFrame() — используйте это, чтобы получить CTFrameRef для вашего текста из вышеуказанного фреймсеттера. Для этого вам нужно будет создать CGPathRef, используя границы вашей метки.
CTFrameGetLines(), CTFrameGetLineOrigins() — используйте их, чтобы получить CTLineRefs, соответствующие набранным строкам, и координаты начала линий соответственно, затем используйте CTLineGetStringIndexForPosition(), чтобы найти индекс символа в месте касания.
Затем вы можете использовать этот индекс символов (в системе отсчета строки), чтобы работать в обратном направлении и найти фактический символ/слово/и т. д. в вашей полной строке.
Не забывайте, что дело осложняется парой вопросов:
Если вы используете собственный рисунок UILabel, вам придется позаботиться о том, чтобы идеально соответствовать вашим метрикам набора текста, что может быть громоздким, поскольку большинство объектов (например, CTFontRef) не связаны бесплатным мостом со своими аналогами UIKit. Реализация собственного чертежа иногда может быть проще, что гарантирует соответствие показателей.
Базовый текст использует инвертированную систему координат по отношению к обычной системе рисования iOS. Если вы получаете дурацкие результаты, и особенно если вы рисуете сами, на это стоит обратить внимание.
Не самая простая задача в мире, но далеко не невыполнимая. Удачи!
person
Conrad Shultz
schedule
10.01.2012