iOS:如何在UITextView中实时将URL设为蓝色?

时间:2018-12-12 00:28:06

标签: ios url uitextview

目标是在用户输入UITextView时实时将URL变成蓝色,类似于Twitter在编写推文时的工作方式。

以下代码显示了一个选项:使用NSDataDetector检测textViewDidChange(textView:)内部的链接。这样,您就可以检测到有人在添加/删除字符以形成/断开URL字符串时的情况,并且还可以在有人粘贴文本块时进行处理。但是,由于您要检查每个键入的字母的全文,因此性能令人恐惧。

textView:shouldChangeTextInRange:replacementText:内部的检测似乎很有希望,因为您仅在检查替换文本。但是,这似乎有点骇人听闻,因为该功能的目的似乎是授予/拒绝编辑文本的权限,而不是修改任何内容。

理想情况下,会有一种更合适的功能来修改替换文本,但似乎没有。

在UITextView中实时为URL着色的最佳方法是什么?

    // Exit if no attributed text
    guard let attributedText = textView.attributedText else {
        return
    }

    // Get mutuable attributed text
    let mutableAttributedText = NSMutableAttributedString(attributedString: attributedText)

    // Detect and linkify URLs in text
    do {
        // Set detector
        let types: NSTextCheckingResult.CheckingType = [.link]
        let detector = try NSDataDetector(types: types.rawValue)
        let detectorRange = NSMakeRange(0, textView.text.count)

        // Iterate over matches
        detector.enumerateMatches(in: textView.text, options: [], range: detectorRange) { result, _, _  in

            // Found detector result?
            if let result = result {

                // Linkify text if it contains URL
                if result.resultType == .link {
                    // Set link attributes
                    let urlString = mutableAttributedText.attributedSubstring(from: result.range)
                    let linkAttributes: [NSAttributedString.Key: Any] = [
                        .foregroundColor: curLinkColor,
                        NSAttributedString.Key.link: urlString
                    ]

                    // Update <mutableAttributedText>
                    mutableAttributedText.addAttributes(linkAttributes, range: result.range)

                    // Print status
                    print("Converted link: \(urlString). Detector result: \(result).")
                }
            }
        }
    } catch {
        printError("Error detecting types in text view: \(error).")
    }

0 个答案:

没有答案