我有一个UITextView,我想改变它的字体大小。 然而,由于它从一个包含多种字体大小的文件中提取,因此我希望它能相应地进行更改。 例如,我有一个字体大小为36的单词和一个字体大小为12的单词,我想将它们按0.75%的比例缩放为27和9。
如果我尝试:
textview.font = UIFont(name: textview.font.fontName, size: 20)
它只会改变整个UITextView的字体大小。
谢谢!
我有一个UITextView,我想改变它的字体大小。 然而,由于它从一个包含多种字体大小的文件中提取,因此我希望它能相应地进行更改。 例如,我有一个字体大小为36的单词和一个字体大小为12的单词,我想将它们按0.75%的比例缩放为27和9。
如果我尝试:
textview.font = UIFont(name: textview.font.fontName, size: 20)
它只会改变整个UITextView的字体大小。
谢谢!
您可以使用这个扩展:
extension NSAttributedString {
@warn_unused_result
func scaleBy(scale: CGFloat) -> NSAttributedString {
let scaledAttributedString = NSMutableAttributedString(attributedString: self)
scaledAttributedString.enumerateAttribute(NSFontAttributeName, inRange: NSRange(location: 0, length: scaledAttributedString.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (value, range, _) in
if let oldFont = value as? UIFont {
let newFont = oldFont.fontWithSize(oldFont.pointSize * scale)
scaledAttributedString.removeAttribute(NSFontAttributeName, range: range)
scaledAttributedString.addAttribute(NSFontAttributeName, value: newFont, range: range)
}
}
return scaledAttributedString
}
}
然后只需调用类似以下的内容:
textField.attributedText = textField.attributedText!.scaleBy(0.5)
例子:
scaleBy
添加到NSAttributedString
中。您可以使用该函数来缩放UITextView
的attributedString
属性的整个内容(如示例中所示)。 - DanielscaleBy
的结果赋值给textView.attributedText
,仅调用scaleBy
不会产生任何效果。 - Daniel@warn_unused_result
,这样如果你计算它而没有使用它,就会收到一个警告。 - Daniel你需要编写(或查找)一个解析器,用于提取每个文本元素的字体大小数据(我认为在大多数情况下这将是\fsN
标签),然后使用该数字(乘以0.75)来单独设置每个单词或短语的大小。如果不同大小的单词需要重新组合成单个字符串,则可以使用属性字符串,但如果每个单词或短语都在单独的标签中,则不必使用属性字符串。
就我个人而言,如果有这样的选项,我会忽略源数据的字体大小,并在应用程序中强制实施漂亮的布局。