2014-02-07 79 views
2

我使用drawInRect:动态构建视图并在其上打印属性文本。一些文字可能包含网页链接。如何检测网页链接上的点击,以便我可以在UIWebView中加载链接?我没有使用UILabel,UITextView或UITextField来显示文本,因为文本包含文本和图像的混合。在NSAttributedString中检测链接上的水龙头

这是绘制文本的我的UIView子类的drawRect中的一些代码。

//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]; 

感谢您的帮助......

+0

这可能给你一些想法。 http://stackoverflow.com/questions/13888941/nsattributedstring-tappable-ios – sangony

+0

你可以发布你的代码?我可以提出一些想法,但这取决于您的自定义视图的工作方式。 – WolfLink

+0

@WolfLink我编辑了我的帖子以包含我如何绘制文本的代码。谢谢。 – SeanT

回答

3

你想要做什么是绘制TextKit文本(iOS中7中引入)。这使您可以通过TextKit来解释水龙头。

下面是一个可下载的例子项目中,我显示的单词列表,并检测用户敲击哪个字上(我甚至通过短暂突出字回应):

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

+0

你能更新这个链接吗?这是404。 –

+0

@DougSmith你想把它移动到原来的位置,还是你想要更新的iOS 8/Swift版本的例子? – matt

+0

iOS 8/Swift版本会很棒。 –

相关问题