将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
相关产品推荐
相关产品推荐

