如何在不使用 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 中列出(几乎)所有表情符号?