保留格式属性时NSAttributedString字体更改

时间:2014-11-29 17:29:42

标签: ios ios7 attributes nsattributedstring uifont

我有一个现有的NSAttributedString,可能包含用户编辑的属性(即Bold,Italic,Underline)。我需要能够将基本字体从Georgia更改为Helvetica,同时保持格式属性。像这样设置字体,覆盖所有格式属性(即Georgia-Bold):

NSDictionary *fontFaceStyle = [[NSDictionary alloc] init];
fontFaceStyle = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:12.0]};
[combinedAttributedTextString setAttributes:fontFaceStyle range:NSMakeRange(0, combinedAttributedTextString.length)];

我看到一些different but related threads建议枚举字符串中的每个属性范围,进行字体更改,然后重新应用适用的格式属性。这似乎相当密集,我不确定当多个属性存在时你是如何应用它的(即粗体和斜体和下划线)。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

我有完全相同的问题,枚举效果很好。这里“range”是你想要处理的范围,“newFamily”是一个字体系列。我正在使用textStorage,我假设在对beginEditing() / endEditing()的调用打包时对这些类型的编辑进行了有用的清理。

textStorage.beginEditing()
textStorage.enumerateAttributes(in: range, options: [], using: { attr, attrRange, _ in
    if let font = attr[NSFontAttributeName] as? NSFont {
        let newFont = NSFontManager.shared().convert(font, toFamily: newFamily)
        storage.addAttribute(NSFontAttributeName, value: newFont, range: attrRange)
    }
})
textStorage.endEditing()