解析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 } }
关键改动说明
- 用do-catch替代try?:捕获HTML解析失败的情况,避免静默失败,此时直接显示原文本。
- 保留原字体样式:通过
fontDescriptor.symbolicTraits判断原字体的粗体、斜体属性,对应创建带权重的系统字体,保留HTML中的格式。 - 设置默认字体:对整个富文本添加默认系统字体,覆盖那些没有font属性的文本,确保所有内容都使用系统字体。
- 优化label赋值逻辑:将label的配置移到枚举和默认字体设置完成后,避免循环中重复赋值,提升效率。
内容的提问来源于stack exchange,提问作者Pravalika
相关产品推荐
相关产品推荐

