2016-12-07 7 views
1

Я работаю над проектом, который необходим, чтобы найти диапазон полужирных слов в текстовом виде и заменить их цвет, я уже пробовал следующее, но это не сработало.Читать все атрибуты NSAttributedString с их эффективным диапазоном

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

} 
+0

любым другим способом, кроме атрибута текста? – user3395433

ответ

5

value аргумент, переданный к закрытию enumerateAttribute с 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) 
     } 
    } 
} 

вы можете изменить цвет в этих диапазонах обычным способом:

//Replace their colors. 
let mutableAttributedText = attributedText.mutableCopy() as! NSMutableAttributedString 
for boldRange in boldRanges { 
    mutableAttributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: boldRange) 
} 
descriptionTextView.attributedText = mutableAttributedText 
+0

Ничего себе. Какой ценный пост, спасибо. – Fattie

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

Примечание - этот пример не дело с раздражающей случае как полужирный и курсивный! Я подумал, что это более информативно.