UITextView with hyperlink text

后端 未结 10 793
抹茶落季
抹茶落季 2020-11-27 19:23

With a non-editable UITextView, I would like to embed text like this in iOS9+:

Just click here to register

I can create a functi

相关标签:
10条回答
  • 2020-11-27 20:07

    If you want to use multiple hyperlinks you can use this alternative for Swift 5

    extension UITextView {
    
      func addHyperLinksToText(originalText: String, hyperLinks: [String: String]) {
        let style = NSMutableParagraphStyle()
        style.alignment = .left
        let attributedOriginalText = NSMutableAttributedString(string: originalText)
        for (hyperLink, urlString) in hyperLinks {
            let linkRange = attributedOriginalText.mutableString.range(of: hyperLink)
            let fullRange = NSRange(location: 0, length: attributedOriginalText.length)
            attributedOriginalText.addAttribute(NSAttributedString.Key.link, value: urlString, range: linkRange)
            attributedOriginalText.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: fullRange)
            attributedOriginalText.addAttribute(NSAttributedString.Key.font, value: YourFont, range: fullRange)
        }
    
        self.linkTextAttributes = [
            NSAttributedString.Key.foregroundColor: YourColor,
            NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue,
        ]
        self.attributedText = attributedOriginalText
      }
    }
    

    Usage:

    yourTextView. addHyperLinksToText(originalText: "Testing hyperlinks here and there", hyperLinks: ["here": "someUrl1", "there": "someUrl2"])
    
    0 讨论(0)
  • 2020-11-27 20:08

    Using Swift >= 4:

    let descriptionText = NSMutableAttributedString(string:"To learn more, check out our ", attributes: [:])
    
    let linkText = NSMutableAttributedString(string: "Privacy Policy and Terms of Use", attributes: [NSAttributedString.Key.link: URL(string: example.com)!])
    
    descriptionText.append(linkText)
    
    0 讨论(0)
  • 2020-11-27 20:10

    Swift 5 This is based on Tejas' answer as a few items in both classes were deprecated.

    extension UITextView {
    
    
    func hyperLink(originalText: String, hyperLink: String, urlString: String) {
    
        let style = NSMutableParagraphStyle()
        style.alignment = .left
    
        let attributedOriginalText = NSMutableAttributedString(string: originalText)
        let linkRange = attributedOriginalText.mutableString.range(of: hyperLink)
        let fullRange = NSMakeRange(0, attributedOriginalText.length)
        attributedOriginalText.addAttribute(NSAttributedString.Key.link, value: urlString, range: linkRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: fullRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.blue, range: fullRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 10), range: fullRange)
    
        self.linkTextAttributes = [
            kCTForegroundColorAttributeName: UIColor.blue,
            kCTUnderlineStyleAttributeName: NSUnderlineStyle.single.rawValue,
            ] as [NSAttributedString.Key : Any]
    
        self.attributedText = attributedOriginalText
    }
    

    Don't forget to add UITextViewDelegate to your view controller and set your let linkUrl = "https://example.com"

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
        if (URL.absoluteString == linkUrl) {
            UIApplication.shared.open(URL) { (Bool) in
    
            }
        }
        return false
    }
    

    Usage stays the same:

    textView.hyperLink(originalText: "To find out more please visit our website", hyperLink: "website", urlString: linkUrl)
    
    0 讨论(0)
  • 2020-11-27 20:16

    The same solution for Swift 3 using extensions :

    A. Add extension -

    extension UITextView {
        func hyperLink(originalText: String, hyperLink: String, urlString: String) {
            let style = NSMutableParagraphStyle()
            style.alignment = .center
            let attributedOriginalText = NSMutableAttributedString(string: originalText)
            let linkRange = attributedOriginalText.mutableString.range(of: hyperLink)
            let fullRange = NSMakeRange(0, attributedOriginalText.length)
            attributedOriginalText.addAttribute(NSLinkAttributeName, value: urlString, range: linkRange)
            attributedOriginalText.addAttribute(NSParagraphStyleAttributeName, value: style, range: fullRange)
            attributedOriginalText.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 10), range: fullRange)
            self.linkTextAttributes = [
                NSForegroundColorAttributeName: UIConfig.primaryColour,
                NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue,
            ]
            self.attributedText = attributedOriginalText
        }
    }
    

    B. Add link url - let linkUrl = "https://www.my_website.com"

    C. Implement UITextViewDelegate in your ViewController like this -

     class MyViewController: UIViewController, UITextViewDelegate { 
     }
    

    D. Add delegate method to handle tap events -

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
        if (URL.absoluteString == linkUrl) {
            UIApplication.shared.openURL(URL)
        }
        return false
        }
    }
    

    E. And finally, things to make sure for your UITextView under attribute inspector -

    1. Behaviour - Editable is turned OFF & Selectable is turned ON.
    2. Data Detectors - Link is turned ON.

    Usage -

    textView.hyperLink(originalText: "To find out more please visit our website", hyperLink: "website", urlString: linkUrl)
    

    Cheers & happy coding!

    0 讨论(0)
提交回复
热议问题