Индекс символов в точке касания для 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 это не имеет этой проблемы.

Ответы на вопрос(5)

Ваш ответ на вопрос