Swift:HTML標(biāo)簽轉(zhuǎn)富文本以及對(duì)P標(biāo)簽的處理

目錄

  • 1、HTML標(biāo)簽轉(zhuǎn) 富文本
  • 2、計(jì)算富文本的Size
  • 3、處理標(biāo)簽中包含 p 標(biāo)簽換行(獨(dú)占一行)的問(wèn)題

一、HTML標(biāo)簽轉(zhuǎn) 富文本(這里寫(xiě)到String的擴(kuò)展里面了)

extension String {
    /// String 或者String HTML標(biāo)簽 轉(zhuǎn) html 富文本設(shè)置
    /// - Parameters:
    ///   - font: 設(shè)置字體
    ///   - lineSpacing: 設(shè)置行高
    /// - Returns: 默認(rèn)不將 \n替換<br/> 返回處理好的富文本
    func setHtmlAttributedString(font: UIFont? = UIFont.systemFont(ofSize: 16), lineSpacing: CGFloat? = 10) -> NSMutableAttributedString {
        var htmlString: NSMutableAttributedString? = nil
        do {
            if let data = self.replacingOccurrences(of: "\n", with: "<br/>").data(using: .utf8) {
                htmlString = try NSMutableAttributedString(data: data, options: [
                NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html,
                NSAttributedString.DocumentReadingOptionKey.characterEncoding: NSNumber(value: String.Encoding.utf8.rawValue)], documentAttributes: nil)
                let wrapHtmlString = NSMutableAttributedString(string: "\n")
                // 判斷尾部是否是換行符
                if let weakHtmlString = htmlString, weakHtmlString.string.hasSuffix("\n") {
                    htmlString?.deleteCharacters(in: NSRange(location: weakHtmlString.length - wrapHtmlString.length, length: wrapHtmlString.length))
                }
            }
        } catch {
        }
        // 設(shè)置富文本字的大小
        if let font = font {
            htmlString?.addAttributes([
            NSAttributedString.Key.font: font], range: NSRange(location: 0, length: htmlString?.length ?? 0))
        }
    
        // 設(shè)置行間距
        if let weakLineSpacing = lineSpacing {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = weakLineSpacing
            htmlString?.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: htmlString?.length ?? 0))
        }
        return htmlString ?? NSMutableAttributedString(string: self)
    }
}

二、計(jì)算富文本的Size

let strHtml = "<p style='color:green'>首付<span style='color:#e83c36;'>5000元</span>,提前付<span style='color:red'>3倍月供</span>,月供<span style='color:red'>3000元</span>(48期)</p>"
let attributedText = strHtml.setHtmlAttributedString(font: UIFont.systemFont(ofSize: 20), lineSpacing: 10)
let textSize = attributedText.boundingRect(with: CGSize(width: kScreenW - 40, height: CGFloat.greatestFiniteMagnitude), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil).size 

三、處理標(biāo)簽中包含 p 標(biāo)簽換行(獨(dú)占一行)的問(wèn)題

  • 3.1、問(wèn)題描述:如果p標(biāo)簽是最大的標(biāo)簽,生成的富文本會(huì)自動(dòng)換行,展示的時(shí)候多一行的高度,如下


    p標(biāo)簽造成的問(wèn)題
  • 3.2、目前的處理辦法:判斷生成的富文本字符串結(jié)尾里面是否有 \n,如果有我們就刪除掉,代碼如下,htmlStringHTML標(biāo)簽轉(zhuǎn)化后的富文本

    let wrapHtmlString = NSMutableAttributedString(string: "\n")
     // 判斷尾部是否是換行符
    if let weakHtmlString = htmlString, weakHtmlString.string.hasSuffix("\n") {
          htmlString?.deleteCharacters(in: NSRange(location: weakHtmlString.length - wrapHtmlString.length, length: wrapHtmlString.length))
    }
    

    處理后的效果圖如下


    處理后的效果圖

具體的 測(cè)試用例StringExtensionViewController.swifttest119() 方法里面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容