读取所有NSAttributedString属性及其有效范围

时间:2016-12-07 15:19:17

标签: swift3 nsattributedstring

我正在研究需要在textview中找到一系列粗体字并替换它们的颜色的项目,我已经尝试了以下但是它没有用。

.enumerateAttribute (NSFontAttributeName, in:NSMakeRange(0, descriptionTextView.attributedText.length), options:.longestEffectiveRangeNotRequired) { value, range, stop in

}

2 个答案:

答案 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()

注意 - 此示例处理两者粗体和斜体的烦人情况!我认为这样的信息量更大。