我正在研究需要在textview中找到一系列粗体字并替换它们的颜色的项目,我已经尝试了以下但是它没有用。
.enumerateAttribute (NSFontAttributeName, in:NSMakeRange(0, descriptionTextView.attributedText.length), options:.longestEffectiveRangeNotRequired) { value, range, stop in
}
答案 0 :(得分:7)
value
的{{1}}参数传递给enumerateAttribute
的{{1}},表示与NSFontAttributeName
绑定的UIFont
。因此,您只需检查字体是否为粗体并收集范围。
range
您可以正常方式更改这些范围内的颜色:
//Find ranges of bold words.
let attributedText = descriptionTextView.attributedText!
var boldRanges: [NSRange] = []
attributedText.enumerateAttribute(NSFontAttributeName, in: NSRange(0..<attributedText.length), options: .longestEffectiveRangeNotRequired) {
value, range, stop in
//Confirm the attribute value is actually a font
if let font = value as? UIFont {
//print(font)
//Check if the font is bold or not
if font.fontDescriptor.symbolicTraits.contains(.traitBold) {
//print("It's bold")
//Collect the range
boldRanges.append(range)
}
}
}
答案 1 :(得分:1)
基于上面的壮观答案,只是一个详细的代码片段来做到这一点。 x
是可变属性字符串。希望它可以节省一些打字。
let f = UIFont.systemFont(ofSize: 20)
let fb = UIFont.boldSystemFont(ofSize: 20)
let fi = UIFont.italicSystemFont(ofSize: 20)
let rangeAll = NSRange(location: 0, length: x.length)
var boldRanges: [NSRange] = []
var italicRanges: [NSRange] = []
x.beginEditing()
print("----------------------->")
x.enumerateAttribute(
NSFontAttributeName,
in: rangeAll,
options: .longestEffectiveRangeNotRequired)
{ value, range, stop in
if let font = value as? UIFont {
if font.fontDescriptor.symbolicTraits.contains(.traitBold) {
print("It's bold!")
boldRanges.append(range)
}
if font.fontDescriptor.symbolicTraits.contains(.traitItalic) {
print("It's italic!")
italicRanges.append(range)
}
}
}
x.setAttributes([NSFontAttributeName: f], range: rangeAll)
for r in boldRanges {
x.addAttribute(NSFontAttributeName, value: fb, range: r)
}
for r in italicRanges {
x.addAttribute(NSFontAttributeName, value: fi, range: r)
}
print("<-----------------------")
using.cachedAttributedString?.endEditing()
注意 - 此示例不处理两者粗体和斜体的烦人情况!我认为这样的信息量更大。