字符串中的属性

Attributes in String

我正在处理文本。我有一些文本属性范围数组,但是当我将斜体应用于已经具有粗体属性的文本时,我的粗体属性消失了。在这种情况下,如何应用我的属性文本使其变为粗体斜体?或者我应该找到我的粗体和斜体范围的交集来应用 boldItalic 属性?

例如,我有 "This is my text",我想得到“This is my text”

抱歉,英语不好。 这是我的代码的一部分

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
}

如果您的应用面向 iOS7.0 及更高版本,您也可以使用 NSObliquenessAttributeName

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

如果有人感兴趣,我找到了解决方案

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