2016-06-09 76 views
2

我有一个UITextView,我想改变它的字体大小。然而,我希望它相对更改,因为它从具有多种字体大小的文件中拉出来,我希望它相应地改变。 例如,我有一个字体大小为36,字体大小为12的单词,我想分别将它们按0.75%缩放到27和9。iOS Swift相对字体大小

如果我尝试:

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

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

谢谢!

+0

什么样的文件?你如何在文件中指定字体? – brimstone

+0

这是一个rtf文件,其中包含字体大小。 – Benny

回答

3

你可以使用这个扩展:

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) 

例子:

Example in playground

+0

我在文件底部添加了扩展名,并尝试了它,但它似乎没有做任何事... – Benny

+0

该扩展将函数'scaleBy'添加到'NSAttributedString'。你可以使用该函数来缩放'UITextView'的'''attributes'字符串的所有内容(例如) – Daniel

+0

@请注意,你必须将'scaleBy'的结果赋给'textView.attributedText'调用'scaleBy'将不会产生任何影响 – Daniel

0

您将不得不为富文本格式文件编写(或查找)解析器,以便为每个文本元素提取字体大小数据(我认为这将是大多数情况下的\fsN标签),然后使用该数字(乘以0.75)来分别设置每个单词或短语的大小。如果不同大小的单词需要重新组合成单​​个字符串,则可以使用归因字符串,但如果每个单词或短语都位于单独的标签中,则不需要这样做。

就个人而言,我会忽略源数据的字体大小,并在应用程序中强制布局,看起来不错,如果这是一个选项。

相关问题