Swift 通过Label 或 TextView加载HTML文本并计算大小

一开始以为在Label或者UITextview 加载HTML 通过

NSAttributedString *attStr = [[NSAttributedString alloc] initWithData:[html dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:nil error:nil];

方法直接转换就可以了后来发现坑还是有一些的,于是做个整理
对了这个是oc的swift的方式是

let html = "自己设置HTML串"
let data = html.data(using: .unicode)
let attributedString = NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)

计算高度
一定注意要转成 characterEncoding类型
在计算size

let html = "自己设置HTML串"
let htmlData = html.data(using: .utf8)
let attstring = try? NSMutableAttributedString(data: htmlData, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: Int()], documentAttributes: nil)
let htmlSize = attstring?.boundingRect(with: size, options: [.usesLineFragmentOrigin], context: nil).size

注意一点是文本转换和高度的转换data用到的 using是不同的一定注意

最后就是成功了
截屏2021-01-12 下午4.05.08.png

如果单纯的只是静态页面展示这个方法可以。
如果是需要在单元格展示滑动会卡顿 主要是HTML转data会阻塞线程
所以应该放在异步线程加载一个要注意

let html = "自己设置HTML串"
DispatchQueue.global().async {
                    if let data = html.data(using: .unicode) {
                        let attributedString = NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
                        let size = CGSize(width: 275, height:CGFloat.greatestFiniteMagnitude)
                        let attstring = try? NSMutableAttributedString(data: htmlData, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: Int()], documentAttributes: nil)
                        guard let htmlSize = attstring?.boundingRect(with: size, options: [.usesLineFragmentOrigin], context: nil).size else { return }
                        DispatchQueue.main.async {
                          //处理回到主线程事件
                        }
                    }
                }

还有个重点,我看了几个博客说是如果是有图片高度计算不精准,本人也测了一下,图片是没问题的会跟着图片大小调整高度的计算还是精准的。
项目比较简单就不给demo了如果有需要可以私聊。谢谢大家

你可能感兴趣的:(Swift 通过Label 或 TextView加载HTML文本并计算大小)