如何在不使用 UIWebView 的情况下在 iOS 10 中显示带有 HTML 标签的文本(使用 swift)

Posted

技术标签:

【中文标题】如何在不使用 UIWebView 的情况下在 iOS 10 中显示带有 HTML 标签的文本(使用 swift)【英文标题】:How to display text with HTML Tags in iOS 10 without using UIWebView (using 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 一起提供的。一些类别见下文 【参考方案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>bodycolor: \(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 转换为这样的属性字符串,非常酷!

以上是关于如何在不使用 UIWebView 的情况下在 iOS 10 中显示带有 HTML 标签的文本(使用 swift)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用原生 ios 应用程序中的 FBSDKShareDialog 的情况下在 Facebook 墙上分享照片或链接

如何在不点击标记的情况下在 iOS 谷歌地图中显示信息窗口?

如何在不更改声音指示器的情况下在 iOS 中以最大音量播放声音文件

如何在不使用任何形式的查找表的情况下在 Swift for iOS 8 中列出(几乎)所有表情符号?

如何在不提示用户提供 Facebook 权限的情况下在 iOS 应用程序中获取公共 Facebook 页面的提要?

是否可以在不使用 socket.io 的情况下在节点中制作聊天应用程序