突出显示 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: [])
可能会成功。
我有一个 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: [])
可能会成功。