菜鸟教程小白 发表于 2022-12-12 17:37:30

ios - 将 HTML 转换为 NSAttributedString 时可以设置默认字体吗?


                                            <p><p>我正在尝试在 UILabel 中显示 HTML,例如</p>

<pre><code>NSString * htmlString = @&#34;Some html string \n &lt;font size=\&#34;13\&#34; color=\&#34;red\&#34;&gt;This is some text!&lt;/font&gt;&#34;;

NSAttributedString * attrStr = [ initWithData: options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
</code></pre>

<p>现在我得到了一个属性字符串</p>

<p>attrStr 的打印说明:
<strong>一些html字符串</strong> </p>

<pre><code>{

...

NSFont = &#34;&lt;UICTFont: 0x7f8240d7c310&gt; font-family: \&#34;Times New Roman\&#34;; font-weight: normal; font-style: normal; **font-size: 12.00pt**&#34;;

}
</code></pre>

<p>这是一段文字!</p>

<pre><code>{

...
NSFont = &#34;&lt;UICTFont: 0x7f8240d7aff0&gt; font-family: \&#34;Times New Roman\&#34;; font-weight: normal; font-style: normal; **font-size: 37.00pt**&#34;;
}
</code></pre>

<p>似乎 <strong>font-size: 12.00pt</strong> 是默认大小,我想在不更改 HTML 源代码的情况下更改大小。该怎么做?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以通过一些编码来完成...您需要检查属性并更改属性字符串每个段的字体大小(如普通、斜体、粗体等...)。</p>

<pre><code>extension String {
    func htmlAttributedString() -&gt; NSMutableAttributedString {

            guard let data = self.data(using: String.Encoding.utf8, allowLossyConversion: false)
                else { return NSMutableAttributedString() }

            guard let formattedString = try? NSMutableAttributedString(data: data,
                                                            options: [.documentType: NSAttributedString.DocumentType.html,
                                                                      .characterEncoding: String.Encoding.utf8.rawValue],
                                                            documentAttributes: nil )

                else { return NSMutableAttributedString() }

            return formattedString
    }

}


extension NSMutableAttributedString {

    func with(font: UIFont) -&gt; NSMutableAttributedString {
      self.enumerateAttribute(NSAttributedStringKey.font, in: NSMakeRange(0, self.length), options: .longestEffectiveRangeNotRequired, using: { (value, range, stop) in
            let originalFont = value as! UIFont
            if let newFont = applyTraitsFromFont(originalFont, to: font) {
                self.addAttribute(NSAttributedStringKey.font, value: newFont, range: range)
            }
      })
      return self
    }

    func applyTraitsFromFont(_ f1: UIFont, to f2: UIFont) -&gt; UIFont? {
      let originalTrait = f1.fontDescriptor.symbolicTraits

      if originalTrait.contains(.traitBold) {
            var traits = f2.fontDescriptor.symbolicTraits
            traits.insert(.traitBold)
            if let fd = f2.fontDescriptor.withSymbolicTraits(traits) {
                return UIFont.init(descriptor: fd, size: 0)
            }
      }
      return f2
    }
}
</code></pre>

<p>你会这样使用它</p>

<pre><code>let formattedString = &#34;text&lt;b&gt;sometext&lt;/b&gt;&#34;
                        .htmlAttributedString()
                        .with(font:UIFont(name: &#34;Times New Roman&#34;, size: 37)!)
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将 HTML 转换为 NSAttributedString 时可以设置默认字体吗?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34263767/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34263767/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将 HTML 转换为 NSAttributedString 时可以设置默认字体吗?