突出显示 UITextView 文本

Highlight UITextView text

我有一个 UITextView,我想在其中为文本添加背景(突出显示)。 我想要突出显示除新行之外的所有内容。我怎样才能做到这一点?

您可以在 NSAttributedString.Key.backgroundColor 上枚举 (enumerate(_:in:option:)) 以仅在有背景时查找变化。 然后,您可以使用正则表达式或带有 range(of:) 的 while 循环来查找它们的位置,并删除它们上的 .backgroundColor

在 Playgrounds 上使用示例代码:

func highlights() -> UITextView {

    let tv = UITextView(frame: CGRect(x: 0, y: 0, width: 300, height: 200))
    tv.backgroundColor = .orange

    let text = "Hello world! How are you today?\nLet's start do some testing.\nAnd this is a long paragraph just to see it to the end of the line."
    let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 15.0),
                                                     .backgroundColor: UIColor.systemPink]

    let first = NSAttributedString(string: text, attributes: attributes)
    let second = NSMutableAttributedString(string: text, attributes: attributes)
    guard let regex = try? NSRegularExpression(pattern: "\n", options: []) else { return tv }
    second.enumerateAttribute(.backgroundColor, in: NSRange(location: 0, length: second.length), options: []) { attribute, range, stop in
        guard attribute as? UIColor != nil else { return }
        guard let subrange = Range(range, in: second.string) else { return }
        let substring = String(second.string[subrange])
        let ranges = regex.matches(in: substring, options: [], range: NSRange(location: 0, length: substring.utf16.count))
        ranges.forEach {
            second.removeAttribute(.backgroundColor, range: [=10=].range)
        }
    }
    let total = NSMutableAttributedString()
    total.append(first)
    total.append(NSAttributedString(string: "\nNormal Text, nothing to see here\n"))
    total.append(second)
    total.append(NSAttributedString(string: "\nNormal Text, nothing to see here\n"))
    tv.attributedText = total
    return tv
}
let tv = highlights()

旁注: 如果您在字符串 "\n \n" 中有可能需要对正则表达式模式进行一些更改,我没有处理这种情况。 快速测试后,NSRegularExpression(pattern: "\n(\s+\n)*", options: []) 可能会成功。