You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析HTML字符串到UILabel时,如何将默认TimesNewRoman改为系统字体?

解决HTML解析到UILabel时替换系统字体丢失格式的问题

我尝试将HTML字符串解析到UILabel中,在if let currentFont = value as? UIFont这一行,系统自动将value赋值为TimesNewRoman字体,我希望替换为系统字体。若使用let dynamicSize = UIFont.systemFont(ofSize: 15),HTML字符串无法正常解析,仅显示普通文本,尝试多种方法无果,恳请帮忙解决。

问题根源

用NSMutableAttributedString解析HTML时,系统会给未指定字体的文本默认分配TimesNewRoman字体。直接替换为固定的systemFont时,一是可能遗漏了无font属性的文本,二是没有保留原HTML中的字体样式(如粗体、斜体),导致格式丢失。

解决方案

修改代码,既要替换已有字体为系统字体并保留样式,也要给无字体属性的文本设置默认系统字体,同时优化label的赋值逻辑:

func parseHtmlString(info: String, label: UILabel) {
    guard let data = info.data(using: .utf8) else { return }
    
    do {
        let attributedString = try NSMutableAttributedString(data: data, 
                                                             options: [.documentType: NSMutableAttributedString.DocumentType.html,
                                                                      .characterEncoding: String.Encoding.utf8.rawValue], 
                                                             documentAttributes: nil)
        
        let dynamicFontSize: CGFloat = UIScreen.main.bounds.width / 22.0
        
        // 替换已有字体为系统字体,保留原样式(粗体、斜体等)
        attributedString.enumerateAttribute(NSAttributedString.Key.font, 
                                           in: NSRange(location: 0, length: attributedString.length), 
                                           options: []) { (value, range, stop) in
            if let currentFont = value as? UIFont {
                var fontWeight: UIFont.Weight = .regular
                if currentFont.fontDescriptor.symbolicTraits.contains(.traitBold) {
                    fontWeight = .bold
                } else if currentFont.fontDescriptor.symbolicTraits.contains(.traitItalic) {
                    fontWeight = .italic
                }
                // 创建对应样式的系统字体
                let systemFont = UIFont.systemFont(ofSize: dynamicFontSize, weight: fontWeight)
                attributedString.addAttribute(NSAttributedString.Key.font, value: systemFont, range: range)
            }
        }
        
        // 给无字体属性的文本设置默认系统字体
        let defaultFont = UIFont.systemFont(ofSize: dynamicFontSize)
        attributedString.addAttributes([NSAttributedString.Key.font: defaultFont], 
                                      range: NSRange(location: 0, length: attributedString.length))
        
        // 统一设置label属性
        label.attributedText = attributedString
        label.numberOfLines = 0
        label.textAlignment = .center
    } catch {
        // 处理解析失败的情况
        label.text = info
        label.numberOfLines = 0
        label.textAlignment = .center
    }
}

关键改动说明

  1. 用do-catch替代try?:捕获HTML解析失败的情况,避免静默失败,此时直接显示原文本。
  2. 保留原字体样式:通过fontDescriptor.symbolicTraits判断原字体的粗体、斜体属性,对应创建带权重的系统字体,保留HTML中的格式。
  3. 设置默认字体:对整个富文本添加默认系统字体,覆盖那些没有font属性的文本,确保所有内容都使用系统字体。
  4. 优化label赋值逻辑:将label的配置移到枚举和默认字体设置完成后,避免循环中重复赋值,提升效率。

内容的提问来源于stack exchange,提问作者Pravalika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:12:38