Получение слова коснулся в UILabel / UITextView - PullRequest
5 голосов
/ 11 января 2012

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

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

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

Есть идеи, как мне это получить?Или, может быть, у вас есть более простое решение для достижения этой цели? Это сообщение, к сожалению, не очень помогло ... ...

Ответы [ 3 ]

9 голосов
/ 11 января 2012

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

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

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

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

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

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

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

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

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

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

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

5 голосов
/ 05 февраля 2014

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

@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.

РЕДАКТИРОВАТЬ: Пример кода для VSWordDetector .

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

2 голосов
/ 08 августа 2013

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

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

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

...