【问题标题】:How to display text with HTML Tags in iOS 10 without using UIWebView (using swift)如何在不使用 UIWebView 的情况下在 iOS 10 中显示带有 HTML 标签的文本(使用 swift)
【发布时间】:2016-10-12 13:06:12
【问题描述】:

目前我正在寻找以下问题的解决方案:

问题: 我正在接收带有 HTML 标签的文本,如<b></b><table><tr><td></td></tr></table> 等。作为 JSON 响应。 我需要将此数据呈现到 iOS(iphone)应用程序的 UI 中,并且它应该以所需的方式表示数据,就像将此数据映射到 web 视图一样。即它应该根据 HTML 标签制作文本 <b>bold</b><table><tr><td>**draw table**</table></tr></td>

我正在使用 Xcode 8 和 Swift 3。

解决方案:??

【问题讨论】:

  • 为了正确解析,您需要获取正确的 JSON 数据。您也可以创建从 HTML 获取响应的代码,我们可以将其称为 HTML 解析,但对于移动应用程序来说这不是很好的做法。如果您可以从响应中删除额外的 HTML 标记,那么 JSON 响应就可以了。
  • 你可能想检查this answer
  • @Wolverine 我的目标是根据数据中的 HTML 标签显示文本。所以如果存在表格标签,它应该绘制表格等。
  • 现在几乎任何控件都可以显示 html .. 它是随 iOS7 IIRC 一起提供的。一些类别见下文

标签: ios swift3


【解决方案1】:

方法总是一样的: 1.将html转为attributedString 2. 在 View/Control/TextView.. 上设置它

希望这会有所帮助。我一直在用它

import UIKit

public extension UIButton {
    public func setHTMLTitle(title: NSString?, for state: UIControlState) {
        guard let title = title else {
            setTitle(nil, for: state)
            return
        }

        guard let titleLabel = titleLabel else {
            setTitle(nil, for: state)
            return
        }

        if titleLabel.font == nil {
            titleLabel.font = UIFont.systemFont(ofSize:UIFont.systemFontSize)
        }

        var c = titleColor(for: state)
        if c == nil {
            c = UIColor.black
            setTitleColor(c, for: state)
        }

        setAttributedTitle(html(html: title, font: titleLabel.font, color: c!), for: state)
    }
}

public extension UILabel {
    public func setHTMLText(text: NSString?) {
        guard let text = text else {
            attributedText = nil
            return
        }

        if font == nil {
            font = UIFont.systemFont(ofSize:UIFont.systemFontSize)
        }
        if textColor == nil {
            textColor = UIColor.black
        }

        attributedText = html(html: text, font: font, color: textColor)
    }
}

public extension UITextView {
    public func setHTMLText(text: NSString?) {
        guard let text = text else {
            attributedText = nil
            return
        }

        if font == nil {
            font = UIFont.systemFont(ofSize:UIFont.systemFontSize)
        }
        if textColor == nil {
            textColor = UIColor.black
        }

        attributedText = html(html: text, font:font!, color:textColor!)
    }
}

//shared helpers

private func html(html:NSString, font:UIFont, color:UIColor) -> NSAttributedString {
    let colorName = colorToHexString(color: color)
    let fontName = font.fontName
    let fontSize = font.pointSize

    let style = "<style>body{color: \(colorName); font-family: '\(fontName)'; font-size:\(fontSize)px;}</style>"
    let htmlString = html.appending(style)
    let d = htmlString.data(using: String.Encoding.utf8)!

    let o = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: NSNumber(value: String.Encoding.utf8.rawValue) as AnyObject] as [String:AnyObject]

    do {
        let attrStr = try NSAttributedString(data:d, options:o, documentAttributes:nil)
        return attrStr
    }
    catch {
        return NSAttributedString(string: "")
    }
}

private func colorToHexString(color: UIColor) -> String {
    var r:CGFloat = 0
    var g:CGFloat = 0
    var b:CGFloat = 0
    var a:CGFloat = 0

    color.getRed(&r, green: &g, blue: &b, alpha: &a)

    let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0

    return String(format:"#%06x", rgb)
}

***免责声明,这是我的开源库 DDUtils 的一部分

【讨论】:

  • 我不知道您可以将 HTML 转换为这样的属性字符串,非常酷!
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多