gpt4 book ai didi

swift - NSAttributedString,更改整体字体但保留所有其他属性?

转载 作者:行者123 更新时间:2023-11-30 10:35:33 25 4
gpt4 key购买 nike

假设我有一个 NSMutableAttributedString

该字符串自始至终都有不同的混合格式:

这是一个例子:

This string is hell to change in iOS, it really sucks.

但是,字体本身并不是您想要的字体。

我想要:

对于每个字符,将该字符更改为特定的字体(例如,Avenir)

但是,

对于每个字符,保留其他属性(粗体、斜体、颜色等)的混合,之前已在该角色上就位。

你到底是怎么做到的?

<小时/>

注意:

如果您在整个范围内简单地添加属性“Avenir”:它只是删除所有其他属性范围,您将丢失所有格式。不幸的是,属性不是,实际上是“可加的”。

最佳答案

由于 rmaddy 的答案对我不起作用( f.fontDescriptor.withFace(font.fontName) 不保留粗体等特征),这里是更新的 Swift 4 版本,还包括颜色更新:

extension NSMutableAttributedString {
func setFontFace(font: UIFont, color: UIColor? = nil) {
beginEditing()
self.enumerateAttribute(
.font,
in: NSRange(location: 0, length: self.length)
) { (value, range, stop) in

if let f = value as? UIFont,
let newFontDescriptor = f.fontDescriptor
.withFamily(font.familyName)
.withSymbolicTraits(f.fontDescriptor.symbolicTraits) {

let newFont = UIFont(
descriptor: newFontDescriptor,
size: font.pointSize
)
removeAttribute(.font, range: range)
addAttribute(.font, value: newFont, range: range)
if let color = color {
removeAttribute(
.foregroundColor,
range: range
)
addAttribute(
.foregroundColor,
value: color,
range: range
)
}
}
}
endEditing()
}
}

或者,如果您的属性组合不包含字体,
那么你不需要删除旧字体:

let myFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize);

myAttributedText.addAttributes(
[NSAttributedString.Key.font: myFont],
range: NSRange(location: 0, length: myAttributedText.string.count));
<小时/>

注释

f.fontDescriptor.withFace(font.fontName) 的问题是它删除了像italic这样的象征性特征, boldcompressed ,因为由于某种原因它会覆盖那些具有该字体默认特征的字体。我完全不明白为什么会出现这种情况,这甚至可能是苹果的疏忽。或者它“不是错误,而是功能”,因为我们免费获得新字体的特征。

所以我们要做的是创建一个字体描述符,它具有原始字体字体描述符的符号特征:.withSymbolicTraits(f.fontDescriptor.symbolicTraits) 。向 rmaddy 提供我迭代的初始代码的 Prop 。

我已经将其发送到生产应用程序中,我们通过 NSAttributedString.DocumentType.html 解析 HTML 字符串。然后通过上面的扩展更改字体和颜色。到目前为止没有任何问题。

关于swift - NSAttributedString,更改整体字体但保留所有其他属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com