Индекс символов в точке касания для UILabel
ДляUILabel
Я хотел бы выяснить, какой индекс символов находится в конкретной точке, полученной от сенсорного события. Я хотел бы решить эту проблему для iOS 7 с помощью Text Kit.
Поскольку UILabel не предоставляет доступ к своимNSLayoutManager
Я создал свой собственный на основеUILabel
Вот такая конфигурация:
- (void)textTapped:(UITapGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateEnded) {
CGPoint location = [recognizer locationInView:self];
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:self.attributedText];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.bounds.size];
[layoutManager addTextContainer:textContainer];
textContainer.maximumNumberOfLines = self.numberOfLines;
textContainer.lineBreakMode = self.lineBreakMode;
NSUInteger characterIndex = [layoutManager characterIndexForPoint:location
inTextContainer:textContainer
fractionOfDistanceBetweenInsertionPoints:NULL];
if (characterIndex < textStorage.length) {
NSRange range = NSMakeRange(characterIndex, 1);
NSString *value = [self.text substringWithRange:range];
NSLog(@"%@, %zd, %zd", value, range.location, range.length);
}
}
}
Код выше находится вUILabel
подкласс сUITapGestureRecognizer
настроен на вызовtextTapped:
(Суть).
Результирующий индекс символа имеет смысл (увеличивается при нажатии слева направо), но не является правильным (последний символ достигается примерно на половине ширины метки). Похоже, что размер шрифта или размер контейнера текста не настроен должным образом, но не может найти проблему.
Я бы очень хотел, чтобы мой класс был подклассомUILabel
Вместо того, чтобы использоватьUITextView
, Кто-нибудь решил эту проблему дляUILabel
?
Обновить: Я потратил билет DTS на этот вопрос, и инженер Apple рекомендовал переопределитьUILabel
«sdrawTextInRect:
с реализацией, которая использует мой собственный менеджер макета, похожий на этот фрагмент кода:
- (void)drawTextInRect:(CGRect)rect
{
[yourLayoutManager drawGlyphsForGlyphRange:NSMakeRange(0, yourTextStorage.length) atPoint:CGPointMake(0, 0)];
}
Я думаю, что было бы много работы, чтобы синхронизировать мой собственный менеджер компоновки с настройками ярлыка, поэтому я, вероятно, пойду сUITextView
несмотря на мое предпочтениеUILabel
.
Обновление 2: Я решил использоватьUITextView
после всего. Целью всего этого было обнаружение нажатий на ссылки, встроенные в текст. Я пытался использоватьNSLinkAttributeName
, но эта настройка не запускает обратный вызов делегата при быстром нажатии на ссылку. Вместо этого вы должны нажать на ссылку в течение определенного периода времени - очень раздражает. Итак, я создалCCHLinkTextView это не имеет этой проблемы.