2016-07-09 2 views
0

Я работаю с текстом. У меня есть несколько массивов диапазонов текстовых атрибутов, но когда я применяю курсив к тексту, который уже имеет жирные атрибуты, мои смелые атрибуты исчезают. Как я могу применить текст атрибутов, чтобы в этом случае стать boldItalic? Или я должен найти пересечение моих смелых и курсивных диапазонов, чтобы применить boldItalic атрибуты?Атрибуты в строке

Например, у меня есть «Это мой текст», и я хочу, чтобы получить «Это является м у текста»

К сожалению, для бедных английского. Это часть моего кода

func attributedArticleText()-> NSMutableAttributedString { 
    let attString = NSMutableAttributedString(attributedString:NSAttributedString(string: articleText)) 
    if let strong = attributes?.strong { 
     for range in strong { 
      attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIDisplay-Bold", size: 12.0)!], range: range.range()) 
     } 
    } 
    if let italic = attributes?.italic { 
     for range in italic { 
      attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIText-LightItalic", size: 12.0)!], range: range.range()) 
     } 
    } 
    if let underLined = attributes?.underline { 
     for range in underLined { 
      attString.addAttributes([NSUnderlineStyleAttributeName: 1], range: range.range()) 
     } 
    } 
    if let cross = attributes?.cross { 
     for range in cross { 
      attString.addAttributes([NSStrikethroughStyleAttributeName: 1], range: range.range()) 
     } 
    } 
    return attString 
} 

ответ

0

Я нашел решение, если кто-то заинтересован

if let italic = attributes?.italic { 
     for range in italic { 
      attString.enumerateAttributesInRange(range.range(), options: NSAttributedStringEnumerationOptions(rawValue: 0), usingBlock: { (dict : [String : AnyObject], rangeNS : NSRange, _) -> Void in 
       if let font = dict["NSFont"] as? UIFont { 
        let descriptor = font.fontDescriptor() 
        if descriptor.symbolicTraits == .TraitBold { 
         attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIText-BoldItalic", size: 12.0)!], range: range.range()) 
        } else { 
         attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIText-LightItalic", size: 12.0)!], range: range.range()) 
        } 
       } 
      }) 
     } 
    } 
1

Вы также можете использовать NSObliquenessAttributeName, если ваше приложение ориентации iOS7.0 и выше

let attr = NSMutableAttributedString(string: text!) 
attr.addAttribute(NSObliquenessAttributeName, value: 0.5, range: NSMakeRange(0, text!.characters.count)) 

в вашем коде, вы меняете один и тот же атрибут дважды NSFontAttributeName.

Это для Bold

attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIDisplay-Bold", size: 12.0)!], range: range.range()) 

И это для LightItalic

attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIText-LightItalic", size: 12.0)!], range: range.range()) 

Решение: шрифт SFUIText-LightItalic не поддерживают Bold. Попробуйте объединить и проверьте, если ваша поддержка шрифтов SFUIDisplay-BoldItalic или что-то подобное, как

attString.addAttributes([NSFontAttributeName : UIFont(name: "SFUIDisplay-BoldItalic", size: 12.0)!], range: range.range()) 
+0

Как я понял, вы говорите, что, когда я добавление новых атрибутов, я на самом деле не добавляю новые, я меняю уже применяемые? –

+0

да, но его также зависит от диапазона, в котором вы проходите, если диапазон одинаковый, то текущий атрибут будет отражаться, а старший будет потерян. –

+0

. Что вам нужно, выделение жирным шрифтом, если я понял вашу проблему, тогда вы должны выбрать соответствующий шрифт. Попробуйте что-то вроде 'BoldItalic', если ваш шрифт поддерживает, так как я вижу, что вы используете разные шрифты' SFUIDisplay' и 'SFUIText' - разные шрифты –