超链接可点击区域在UITextView中受到干扰

时间:2018-06-21 17:02:01

标签: ios swift xcode uitextview

我正在使用UITextView显示以下文本:

txtTest.userInteractionEnabled = true;
txtTest.selectable = true
txtTest.dataDetectorTypes = .Link;
txtTest.text = "<p>لتيتنظربهاإلىالأمورتؤثربنجاحكفيالعملفعلًاأتعرفالقولالمأثورالقديملاتنظرللنصفالفارغمنالكأسوالطريقةالتيتنظربهاإلىالأمورتؤثربنجاحكفيالعملفعلًا</p><a href=\"https://google.com\" target=\"_blank\">رابط خارجي external link</a>"
在文本UITextView上无法点击

رابط خارجي external link链接。可插拔区域位于UITextView中的其他位置。我只是通过点击UITextView

上的随机位置来解决这个问题

不知道这是UITextView的错误还是我身边缺少了某些东西。如果有人遇到过同样的问题并找到了解决方案?

1 个答案:

答案 0 :(得分:0)

您将必须使UIViewController接受UITextViewDelegate协议的确认,并实现textView(_:shouldInteractWith:in:interaction :)。您的标准UITextView设置应该看起来像这样,不要忘记delegatedataDetectorTypes

txtTest.delegate = self
txtTest.isUserInteractionEnabled = true // default: true
txtTest.isEditable = false // default: true
txtTest.isSelectable = true // default: true
txtTest.dataDetectorTypes = [.link]

UITextViewDelegate方法shouldInteractWithURL

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    print("Link Selected!")
    return true
}

而不是使用锚标记,而是使用attributedText来快速检测所选文本中的链接。

    let targetLink = "https://google.com"

    let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: UIFont.systemFont(ofSize: 15)]
    let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: UIFont.systemFont(ofSize: 25)]

    let partOne = NSMutableAttributedString(string: "لتيتنظربهاإلىالأمورتؤثربنجاحكفيالعملفعلًاأتعرفالقولالمأثورالقديملاتنظرللنصفالفارغمنالكأسوالطريقةالتيتنظربهاإلىالأمورتؤثربنجاحكفيالعملفعلً ", attributes: yourAttributes)
    let partTwo = NSMutableAttributedString(string: " رابط خارجي external link", attributes: yourOtherAttributes)
    let text = " رابط خارجي external link"
    let str = NSString(string: text)
    let theRange = str.range(of: text)
    partTwo.addAttribute(NSLinkAttributeName, value: targetLink, range: theRange)

    let combination = NSMutableAttributedString()

    combination.append(partOne)
    combination.append(partTwo)
    txtTest.attributedText = combination

如果要使用HTML,则仍必须将其转换为NSAttributedString。此函数会将所有HTML标记转换为NSAttributedString

extension String{
    func convertHtml() -> NSAttributedString{
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do{
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }catch{
            return NSAttributedString()
        }
    }
}

然后您可以像这样使用它。

let stringValue = "<p>لتيتنظربهاإلىالأمورتؤثربنجاحكفيالعملفعلًاأتعرفالقولالمأثورالقديملاتنظرللنصفالفارغمنالكأسوالطريقةالتيتنظربهاإلىالأمورتؤثربنجاحكفيالعملفعلًا</p><a href=\"https://google.com\" target=\"_blank\">رابط خارجي external link</a>"

txtTest.attributedText = stringValue.convertHtml()