Обнаружение постукивания по ссылке в NSAttributedString

Я динамически создаю представления и печатаю атрибутивный текст на них, используя drawInRect:. Часть текста может содержать веб-ссылки. Как я могу обнаружить нажатия на веб-ссылки, чтобы я мог загрузить ссылку в UIWebView? Я не использую UILabel, UITextView или UITextField для отображения текста, потому что текст содержит смесь текста и изображений.

Это часть кода в drawRect для моего подкласса UIView, который рисует текст.

//draw the text

    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:self.message.text];

    [attString beginEditing];

    NSArray *arrString = [attString.string componentsSeparatedByString:@" "];
    for (NSString *str in arrString)
    {
        if ([str rangeOfString:@"http://" options:NSCaseInsensitiveSearch].location != NSNotFound ||
            [str rangeOfString:@".com"    options:NSCaseInsensitiveSearch].location != NSNotFound ||
            [str rangeOfString:@".gov"    options:NSCaseInsensitiveSearch].location != NSNotFound ||
            [str rangeOfString:@".org"    options:NSCaseInsensitiveSearch].location != NSNotFound ||
            [str rangeOfString:@".edu"    options:NSCaseInsensitiveSearch].location != NSNotFound ||
            [str rangeOfString:@".net"    options:NSCaseInsensitiveSearch].location != NSNotFound ||
            [str rangeOfString:@".xxx"    options:NSCaseInsensitiveSearch].location != NSNotFound)
        {
            NSRange rng = [attString.string rangeOfString:str];

            NSString *url;

            if ([str rangeOfString:@"http://"  options:NSCaseInsensitiveSearch].location == NSNotFound &&
                [str rangeOfString:@"https://" options:NSCaseInsensitiveSearch].location == NSNotFound)
            {
                url = [NSString stringWithFormat:@"http://%@", str];
            }
            else
            {
                url = str;
            }

            [attString addAttribute:NSLinkAttributeName value:[NSURL URLWithString:url] range:rng];
        }
    }

    [attString endEditing];

    CGSize theSize;
    theSize = [attString.string sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(CHAT_TEXT_WIDTH, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    [[UIColor blackColor] set];
    CGRect textRect = CGRectMake(0, 0, theSize.width, theSize.height);
    textRect.origin.x += 10;
    textRect.origin.y += 10;

    if (self.type == MESSAGE_BOX_RECEIVE) {
        textRect.origin.x += ARROW_WIDTH;
    }

    [attString drawInRect:textRect];

Спасибо за любую помощь...

1 ответ

То, что вы хотите сделать, это нарисовать текст с помощью TextKit (представлен в iOS 7). Это позволяет также интерпретировать касания посредством TextKit.

Вот пример загружаемого проекта, в котором я отображаю список слов и определяю, какое слово нажал пользователь (и я даже отвечаю мгновенным выделением слова):

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch10p543drawingWithTextKit/ch23p815attributedStringDrawing3/StyledText.swift

Другие вопросы по тегам