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

将HTML字符串转为Attributed String赋值给TextView出现多余空白求助

解决HTML转AttributedString后TextView出现多余空白的问题

我太懂你卡了8小时的烦躁了!咱们一步步拆解这个问题,把多余空白彻底干掉。

先看你提供的HTML字符串,里面藏了几个会导致空白的“隐形坑”:

  • 末尾带<br>的空<div>标签,会额外占出行高空间
  • 那个base64编码的空白小图片,也会默默占据一块区域
  • 系统默认的HTML转AttributedString逻辑,会自动给段落加上默认间距,再加上TextView本身的默认内边距,空白就被放大了

方案一:先清理HTML里的冗余垃圾

在转换之前,先把没用的元素删掉,这是最直接的办法。给你的String扩展加个清理方法:

extension String {
    var cleanedHTML: String {
        // 移除带空br的div标签
        let removedEmptyDiv = replacingOccurrences(of: "<div[^>]*>(\\s*<br\\s*/?>\\s*)*</div>", with: "", options: .regularExpression)
        // 移除那个空白的base64图片
        let removedBlankImage = removedEmptyDiv.replacingOccurrences(of: "<img[^>]*src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAIAAADwf7zUAAAKMWlDQ1BJQ0MgUHIAQAAAAAICAEAAAAACAgBAAAAAAgIAQAAAAAICD/H8/yGKggh8zsAAAAAElFTkSuQmCC\"[^>]*>", with: "", options: .regularExpression)
        return removedBlankImage
    }
    
    var htmlToAttributedString: NSAttributedString? {
        guard let data = cleanedHTML.data(using: .utf8) else { return NSAttributedString() }
        do {
            return try NSAttributedString(data: data, options: [
                .documentType: NSAttributedString.DocumentType.html,
                .characterEncoding: String.Encoding.utf8.rawValue
            ], documentAttributes: nil)
        } catch {
            return NSAttributedString()
        }
    }
    
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}

方案二:手动修正段落样式

就算清理了HTML,系统转换后的段落可能还是有多余间距,咱们手动把它掰回来:

// 转换后处理富文本
if let originalAttrStr = sampleHTML.cleanedHTML.htmlToAttributedString {
    let mutableAttrStr = NSMutableAttributedString(attributedString: originalAttrStr)
    let fullRange = NSRange(location: 0, length: mutableAttrStr.length)
    
    // 获取原有段落样式,或者新建一个
    let paragraphStyle = NSMutableParagraphStyle()
    mutableAttrStr.enumerateAttribute(.paragraphStyle, in: fullRange) { value, _, _ in
        if let existingStyle = value as? NSParagraphStyle {
            paragraphStyle.setParagraphStyle(existingStyle)
        }
    }
    
    // 把多余的间距都设为0
    paragraphStyle.lineSpacing = 0
    paragraphStyle.paragraphSpacing = 0
    paragraphStyle.paragraphSpacingBefore = 0
    
    mutableAttrStr.addAttribute(.paragraphStyle, value: paragraphStyle, range: fullRange)
    
    cell.txtViewHTML.attributedText = mutableAttrStr
}

方案三:把TextView的默认空白关掉

TextView本身自带内边距,也会让内容看起来有空白,直接把它清零:

cell.txtViewHTML.contentInset = UIEdgeInsets.zero
cell.txtViewHTML.textContainerInset = UIEdgeInsets.zero
cell.txtViewHTML.textContainer.lineFragmentPadding = 0

把这三个步骤结合起来,应该就能彻底解决多余空白的问题了。你可以先试清理HTML,再调整段落样式,最后检查TextView设置,一步步排查肯定能搞定!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:27:45