字符串中的属性

时间:2016-07-09 09:16:40

标签: xcode swift textview nsattributedstring

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

例如,我有“这是我的文字”,我想得到“ y 文字”

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

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
}

2 个答案:

答案 0 :(得分:1)

如果您的应用定位到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())

答案 1 :(得分: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())
                    }
                }
            })
        }
    }