假设我有一个NSMutableAttributedString
。
该字符串自始至终都混合了各种格式:
下面是一个例子:
这个字符串在iOS中是**改变的地狱,它真的很糟糕**。
然而,字体本身并不是您想要的字体。
我想:
对于每个字符,将该字符更改为特定的字体(例如,Avenir)
但是,
对于每个字符,保留先前在该字符上存在的其他*属性(粗体、斜体、颜色等)的混合。**
见鬼,你是怎么做到的?
注:
如果您在整个范围内简单地添加一个属性“Avenir”:它只是删除所有其他属性范围,您将丢失所有格式。不幸的是,属性不是,实际上是“相加的”。
6条答案
按热度按时间vqlkdk9b1#
由于rmaddy的回答对我不起作用(
f.fontDescriptor.withFace(font.fontName)
没有保留粗体等特征),下面是SWIFT 4的更新版本,其中也包括颜色更新:或如果混合属性不包括字体,
然后,您不需要删除旧字体:
注意事项
f.fontDescriptor.withFace(font.fontName)
的问题是它删除了像italic
、bold
或compressed
这样的符号特征,因为出于某种原因,它会覆盖那些具有该字体默认特征的特征。为什么我完全不明白这一点,这甚至可能是苹果的一个疏忽;或者这是“不是一个错误,而是一个功能”,因为我们免费获得了新字体的特性。因此,我们要做的是创建一个字体描述符,它具有来自原始字体的字体描述符的符号特征:
.withSymbolicTraits(f.fontDescriptor.symbolicTraits)
。我迭代的初始代码的道具是rmaddy。我已经在一个生产应用程序中提供了这一功能,我们通过
NSAttributedString.DocumentType.html
解析一个HTML字符串,然后通过上面的扩展更改字体和颜色。到目前为止还没有问题。gg0vcinb2#
这里有一个简单得多的实现,它保持所有属性不变,包括所有字体属性,但它允许您更改字体外观。
请注意,这仅使用传入字体的字体外观(名称)。大小与现有字体保持不变。如果还想将所有现有字体大小更改为新大小,请将
f.pointSize
更改为font.pointSize
。要使用它:
2wnc66cl3#
我对OSX/AppKit的两点看法>
clj7thdc4#
重要-
Rmaddy已经发明了一种全新的技术来解决iOS中的这个恼人的问题。
Manmal给出的答案是最终的完美版本。
纯粹是为了历史记录这里大致是你在过去是如何做的……
。
NSattributedString
的说明。你将得到很好的属性范围(斜体、粗体等),但字体将是你不想要的字体。*。
wljmcqd85#
OBJ-C版本的@manmal的答案
ix0qys7i6#
让UITextfield来做这项工作是否有效?
如下所示,给定
attributedString
和newfont
:对不起,我错了,它保留了像NSForegoundColorAttributeName这样的“字符属性”,例如颜色,但不保留UIFontDescriptorSymbolicTraits,它描述粗体、斜体、浓缩等。
这些属于字体,而不是“字符属性”。所以,如果你改变了字体,你也改变了特征。对不起,我提出的解决方案不起作用。目标字体需要将所有特征作为原始字体才能使用。