iOS Swift 相对字体大小

3

我有一个UITextView,我想改变它的字体大小。 然而,由于它从一个包含多种字体大小的文件中提取,因此我希望它能相应地进行更改。 例如,我有一个字体大小为36的单词和一个字体大小为12的单词,我想将它们按0.75%的比例缩放为27和9。

如果我尝试:

textview.font = UIFont(name: textview.font.fontName, size: 20)

它只会改变整个UITextView的字体大小。

谢谢!


什么类型的文件?你是如何在文件中指定字体的? - brimstone
它是一个带有字体大小的rtf文件。 - Benny
2个回答

4

您可以使用这个扩展:

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)

例子:

在游乐场中的例子


这是一个关于IT技术的图片,没有具体的解释。

我在文件底部添加了扩展名并尝试了一下,但似乎没有任何作用... - Benny
该扩展将函数scaleBy添加到NSAttributedString中。您可以使用该函数来缩放UITextViewattributedString属性的整个内容(如示例中所示)。 - Daniel
@Benny 注意,你必须将scaleBy的结果赋值给textView.attributedText,仅调用scaleBy不会产生任何效果。 - Daniel
我在函数中添加了@warn_unused_result,这样如果你计算它而没有使用它,就会收到一个警告。 - Daniel
是的,我忘记给它赋值了。我真笨 :) 谢谢!! 标记为已回答 - Benny

0

你需要编写(或查找)一个解析器,用于提取每个文本元素的字体大小数据(我认为在大多数情况下这将是\fsN标签),然后使用该数字(乘以0.75)来单独设置每个单词或短语的大小。如果不同大小的单词需要重新组合成单个字符串,则可以使用属性字符串,但如果每个单词或短语都在单独的标签中,则不必使用属性字符串。

就我个人而言,如果有这样的选项,我会忽略源数据的字体大小,并在应用程序中强制实施漂亮的布局。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接