swift:转换为 NSAttributed 字符串的 HTML 数据不会使标签中的链接可点击
swift: The HTML data converted to NSAttributed string doesn't make the links clickable in label
我有一个 HTML 格式的文本。我正在使用 NSAttributed 字符串的 属性 来解析它。它很好地解析文本并显示在标签上。但是,锚标记的解析不会使 link 可点击。这是我用于解析的以下代码。
extension String {
var htmlToAttributedString: NSAttributedString? {
guard let data = data(using: .utf8) else { return NSAttributedString() }
do {
return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
} catch {
return NSAttributedString()
}
}
var htmlToString: String {
return htmlToAttributedString?.string ?? ""
}
当我 运行 应用并将值赋予标签时:
text = "<p>This is <a href=\"http://www.google.com\">Google Home</a></p>"
simpleTextLabel.attributedText = text.htmlToAttributedString
iOS 应用程序的输出如下所示,但点击后没有任何反应:
这是Google Home。
如何在 Safari 中打开它?
来自您的线路:
simpleTextLabel.attributedText = text.htmlToAttributedString
我们可以假设 simpleTextLabel
是 UILabel
.
从 UILabel
到不是 "interactable" 的基本行为。您可以在其上添加点击手势,但它会将其转换为 UIButton
.
有一些技巧可以使 UILabel
成为可能,找到它被点击的确切位置,检查是否有 link,等等。
寻找 "UILabel Clickable": Create tap-able "links" in the NSAttributedString of a UILabel? 等。甚至还有一些第三方库。
我(依我拙见)认为它是"hack".
有个不错WWDC 2018 Session: TextKit Best Practices。在 2:34,它解释说如果您需要与显示的文本进行交互,更喜欢 UITextView
而不是 UILabel
。
有一个 UITextViewDelegate
方法可以做到这一点:textView(_:shouldInteractWith:in:interaction:)
请注意 UITextView
和 UILabel
的渲染略有不同。如果将它们叠加,它们将不会具有相同的 "start point",布局略有不同。然而,稍作改动,它可以是相同的(例如:How can I make a UITextView layout text the same as a UILabel?)。
另请注意,根据 UITextView
到 UILabel
视觉渲染的小修改,用户不会注意到差异(事实上,除了使用原生之外,这才是最重要的UITextView
/UITextViewDelegate
的方法可以让其他开发人员事后轻松理解,或者如果您需要进行小的修改,则可以在几个月后理解。
我有一个 HTML 格式的文本。我正在使用 NSAttributed 字符串的 属性 来解析它。它很好地解析文本并显示在标签上。但是,锚标记的解析不会使 link 可点击。这是我用于解析的以下代码。
extension String {
var htmlToAttributedString: NSAttributedString? {
guard let data = data(using: .utf8) else { return NSAttributedString() }
do {
return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
} catch {
return NSAttributedString()
}
}
var htmlToString: String {
return htmlToAttributedString?.string ?? ""
}
当我 运行 应用并将值赋予标签时:
text = "<p>This is <a href=\"http://www.google.com\">Google Home</a></p>"
simpleTextLabel.attributedText = text.htmlToAttributedString
iOS 应用程序的输出如下所示,但点击后没有任何反应:
这是Google Home。
如何在 Safari 中打开它?
来自您的线路:
simpleTextLabel.attributedText = text.htmlToAttributedString
我们可以假设 simpleTextLabel
是 UILabel
.
从 UILabel
到不是 "interactable" 的基本行为。您可以在其上添加点击手势,但它会将其转换为 UIButton
.
有一些技巧可以使 UILabel
成为可能,找到它被点击的确切位置,检查是否有 link,等等。
寻找 "UILabel Clickable": Create tap-able "links" in the NSAttributedString of a UILabel? 等。甚至还有一些第三方库。
我(依我拙见)认为它是"hack".
有个不错WWDC 2018 Session: TextKit Best Practices。在 2:34,它解释说如果您需要与显示的文本进行交互,更喜欢 UITextView
而不是 UILabel
。
有一个 UITextViewDelegate
方法可以做到这一点:textView(_:shouldInteractWith:in:interaction:)
请注意 UITextView
和 UILabel
的渲染略有不同。如果将它们叠加,它们将不会具有相同的 "start point",布局略有不同。然而,稍作改动,它可以是相同的(例如:How can I make a UITextView layout text the same as a UILabel?)。
另请注意,根据 UITextView
到 UILabel
视觉渲染的小修改,用户不会注意到差异(事实上,除了使用原生之外,这才是最重要的UITextView
/UITextViewDelegate
的方法可以让其他开发人员事后轻松理解,或者如果您需要进行小的修改,则可以在几个月后理解。