Получение слова, затронутого в UILabel / UITextView

То, что я хотел бы сделать, – создать компонент текстового контейнера, который сможет указать, что является ближайшим словом, когда есть касание к нему (т.е. слово «позади» затронутой точки).

Во-первых, я создал подкласс UILabel и переопределил метод toucedEnded: withEvent: для определения затронутого CGPoint. Я также написал метод, который вычисляет соответствующий «кадр» (CGRect) каждого слова текста, используя sizeWithFont: forWidth: lineBreakMode :. С затронутым CGPoint и этим фреймом я могу определить, какое слово на самом деле тронуто. Но метод, который вычисляет фрейм, работает только с монострочным текстом.

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

Любая идея, как я могу это получить? Или, может быть, у вас есть более простое решение для этого? Этот пост, к сожалению, не очень полезен … …

(В вашей связанной записи есть ссылка на проект кода кода, который содержит некоторый полезный пример кода, но я также опишу этот процесс для вас здесь.)

Короче говоря, вам понадобится использовать Core Text, который представляет собой усовершенствованную платформу для обработки текста на основе C, которая поддерживает все сложные текстовые макеты в iOS и OS X.

Полный код будет в некоторой степени задействован, но ключевые методы, которые вы хотите посмотреть:

CTFramesetterCreateWithAttributedString () – используйте это вместе с NSAttributedString, которое вы получите из текста вашего ярлыка, – чтобы создать набор фреймов

CTFramesetterCreateFrame () – используйте это, чтобы получить CTFrameRef для вашего текста из вышеуказанного набора фреймов. Вам нужно будет создать CGPathRef, используя ваши метки для этого.

CTFrameGetLines (), CTFrameGetLineOrigins () – используйте их для получения CTLineRefs, соответствующих строкам набора, и координат начала строки, соответственно, затем используйте CTLineGetStringIndexForPosition (), чтобы найти индекс символа в месте касания.

Вы можете использовать этот индекс символа (в системе отсчета линии), чтобы работать в обратном направлении и найти фактический характер / слово / и т.д. в пределах вашей полной строки.

Не забывайте, что дело осложняется парами вопросов:

  1. Если вы используете собственный чертеж UILabel, вам придется позаботиться о том, чтобы полностью соответствовать вашим меткам набора, что может быть громоздким, поскольку большинство объектов (например, CTFontRef) не являются бесплатными для мостов с их UIKit-аналогами. Реализация собственного чертежа иногда может быть проще, что гарантирует соответствие показателей.

  2. Core Text использует инвертированную систему координат относительно обычной системы рисования iOS. Если вы получаете дурные результаты, и особенно, если вы делаете свой собственный рисунок, это то, на что нужно взглянуть.

Не самая легкая задача в мире, но далека от невозможности. Удачи!

После некоторого поиска я написал код для этого. Код будет работать для UITextView и UILabel .
Просто скачайте VSWordDetector.zip, затем распакуйте его и перетащите и отпустите папку VSWordDetector в свой проект.
Существует два файла: VSWordDetector.h и VSWordDetector.m
#import VSWordDetector.h в вашем классе ViewController .

 @property (strong, nonatomic) VSWordDetector *wordDetector; 

Примечание. Сделать его свойство не воспринимать как локально.

Теперь он готов для вас, просто добавьте его в textViews или Labels

 -(void)viewDidLoad { self.wordDetector = [[VSWordDetector alloc] initWithDelegate:self]; [self.wordDetector addOnView:textView]; [self.wordDetector addOnView:label]; } -(void)wordDetector:(VSWordDetector *)wordDetector detectWord:(NSString *)word { NSLog(@"Detected Word: %@", word); } 

Этот метод делегата будет вызываться, когда вы нажмете на подключенную метку или textView.

EDIT: Пример кода для VSWordDetector .

ПРЕДЛАГАЕМЫЙ РЕДАКТИРОВАНИЕ: Если вы не хотите загружать образец кода, вот код для обоих файлов. Пожалуйста, смотрите этот файл VSWordDetector .

Хотя это старый вопрос, но я подумал, что это может помочь.

Поскольку основной текст текста был огромным, я выбрал GLTapDemo немецким Laullon

С некоторыми изменениями, это отлично работает для обнаружения затронутого слова на UILabel.

Interesting Posts

Native iOS Facebook SSO не вернется в приложение

«Неоднозначная ссылка на участника» при создании удобства init в расширении

Проблема ограничения горизонтального центра в ios?

Есть ли способ, которым мы можем дать фиктивный вход для restkit?

Отклонить UIAlertControllerStyleAlert UIAlertController, нажав снаружи

Совместное использование сеанса аутентификации Firebase из приложения-контейнера iOS с расширениями приложений

Входной карет, плавающий над фиксированным слоем при прокрутке

Получить твиттер Follower в IOS 5

iOS автоматически возобновляемые подписки: потоки проверки поступления

Мониторинг регионов, но значок местоположения исчезает, когда приложение убито

Действия кнопки в подвью, имеющие ошибку «непризнанный селектор, отправленный в экземпляр»

NSTimer не вызывает метод

Получение всех CNG-групп из CNContactStore

Сохранение панели вкладок в режиме просмотра после сеанса?

делегат менеджера местоположений, не названный iOS swift

Давайте будем гением компьютера.