美文网首页
UITextView实现多链接文本

UITextView实现多链接文本

作者: 山有木枝壮 | 来源:发表于2017-06-02 20:46 被阅读173次
    咋地.png

    一、前言

    废话不说,想实现的效果如下图,使用UITextView实现链接点击跳转的效果,UILabel可以实现效果,但是不支持部分文字点击效果。(支持方法比较麻烦)


    UITextView多链接

    二、实现方法

    1、在NSMutableAttributedString创建extension,用来创建连接文本和对应的链接
    <pre>
    extension NSMutableAttributedString {
    public func addLink(_ source: String, link: String, attributes: [String : Any]? = nil) {
    let linkString = NSMutableAttributedString(string: source, attributes: attributes)
    let range: NSRange = NSRange(location: 0, length: linkString.length)
    linkString.beginEditing()
    linkString.addAttribute(NSLinkAttributeName, value: link, range: range)
    linkString.endEditing()
    self.append(linkString)
    }

    public func append(_ string: String, attributes: [String : Any]? = nil) {
        let attrString = NSAttributedString(string: string, attributes: attributes)
        self.append(attrString)
    }
    

    }
    </pre>

    2、创建UITextView,设置attributeStirng,实现代理
    UITextViewDelegate.
    <pre>
    view.delegate = USLinkTextManger.instance
    view.isEditable = false
    let attributes = [NSForegroundColorAttributeName: USColor.c301.color,NSFontAttributeName: USFont.t05.font]
    let attrString = NSMutableAttributedString()
    attrString.append(NSAttributedString(string: "有疑问,欢迎拨打", attributes: attributes))
    attrString.addLink("17711678021", link: "protocol1://", attributes: attributes)
    attrString.append(NSAttributedString(string: "也可以通过邮箱联系我们", attributes: attributes))
    attrString.addLink("xiniu@wtest.com", link: "protocol2://", attributes: attributes)
    view.attributedText = attrString
    </pre>

    实现代理,协议是自定义的
    <pre>
    @available(iOS 10.0, *)
    public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    guard let scheme = url.scheme else {
    return false
    }
    switch scheme {
    case "protocol1":
    print("protocol1")
    case "protocol2":
    print("protocol2")
    default:
    break
    }

            return true
    }
    
    public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    

    guard let scheme = url.scheme else {
    return false
    }
    switch scheme {
    case "tel":
    print("tel")
    case "mail":
    print("mail")
    default:
    break
    }

            return true
    }
    

    </pre>

    在代理中,根据自己定义的协议实现不同的方法,可以跳转到原生,也可以新开h5页面

    三、需要注意

    1、如果需要自定义链接颜色,可以使用UITextView的linkTextAttributes属性

    view.linkTextAttributes = [NSForegroundColorAttributeName: UIColor.red]]
    2、如果是自定义链接,UITextView应该禁止编辑,使用isEditable属性.禁止上下滚动使用isScrollEnable

    相关文章

      网友评论

          本文标题:UITextView实现多链接文本

          本文链接:https://www.haomeiwen.com/subject/shqyxxtx.html