当我们有一段文字,而一些特定的文字需要执行一些功能,比如打电话,复制内容或者跳转网页等等功能,就需要给属性文字加入定义好的链接,在uitextview的代理方法中拿到这些链接,以实现功能。
以上面的图片为例,需求是点击练习客服和关注微信后实现一些功能
第一步定义好链接的url 比如联系客服和打电话可以自定义url的 scheme 在项目中定义scheme.如果是mvp模式可以是路由的url链接地址 NSString *const KEFU_SCEME = @"makeFPoneCall"; NSString *const GUANZHU_SCEME = @"followWeChat";根据scheme拼接的完整的url就是makeFPoneCall://xxxx
第二部自定义UITextView 代码如下 -(instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor clearColor]; self.editable = NO; self.textAlignment = NSTextAlignmentLeft; self.dataDetectorTypes = UIDataDetectorTypeAll; //设置超链接富文本 NSString *kefuStr = @"联系客服"; NSString *guanzhuStr = @"关注微信"; NSString *textString = [NSString stringWithFormat:@"遇到问题?您可以%@或%@",kefuStr,guanzhuStr]; NSRange rangeKefu = [textString rangeOfString:kefuStr]; NSRange rangeGuanZhu = [textString rangeOfString:guanzhuStr]; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; style.firstLineHeadIndent = 1; style.lineSpacing=5*kWidthRatio; NSDictionary *attachDic = @{ NSFontAttributeName:PFRFont(12), NSForegroundColorAttributeName:HEXCOLOR(0xFAB3B2), NSParagraphStyleAttributeName:style }; NSMutableAttributedString *strM = [[NSMutableAttributedString alloc] initWithString:textString attributes:attachDic]; //设置文字颜色 [strM addAttribute:NSForegroundColorAttributeName value:HEXCOLOR(0x78BEE9) range:rangeKefu]; [strM addAttribute:NSForegroundColorAttributeName value:HEXCOLOR(0x78BEE9) range:rangeGuanZhu]; //设置富文本超链接属性 NSString *link1 = [[NSString stringWithFormat:@"%@://%@",KEFU_SCEME,kefuStr] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]; NSString *link2 = [[NSString stringWithFormat:@"%@://%@",GUANZHU_SCEME,guanzhuStr] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]; [strM addAttribute:NSLinkAttributeName value:link1 range:rangeKefu]; [strM addAttribute:NSLinkAttributeName value:link2 range:rangeGuanZhu]; //清除超链接本身的颜色 self.linkTextAttributes = @{}; self.attributedText = strM; } return self; }值得注意的是,由于超链接是有默认的文字属性样式的所以要self.linkTextAttributes = @{}; 提前将默认样式清空.
控制器中实现代理方法 -(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{ NSString *scheme = URL.scheme; if ([scheme isEqualToString:KEFU_SCEME]) { NSString * phone = [GMFilterTool regularExpressionWithString:KEFU_PHONE ReplaceStr:@""]; [GMFilterTool callPhoneNumer:phone]; return NO; }else if ([scheme isEqualToString:GUANZHU_SCEME]){ UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = WEIXIN_NUM; [GMHudHelper ShowText:[NSString stringWithFormat:@"微信号:%@已复制",WEIXIN_NUM]]; return NO; } return YES; }