1

我有一个 HTML 格式的文本。我正在使用 NSAttributed 字符串的属性来解析它。它很好地解析文本并显示在标签上。但是,锚标记的解析不会使链接可点击。这是我用于解析的以下代码。

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 App 上的输出如下所示,但单击时没有任何反应:

这是谷歌主页

我怎样才能让它在 safari 中打开?

4

1 回答 1

2

从你的行:

simpleTextLabel.attributedText = text.htmlToAttributedString

我们可以假设这simpleTextLabel是一个UILabel.

UILabel这是从 a到不可“交互”的基本行为。您可以在其上添加轻击手势,但会将其转换为UIButton.

有一些技巧可以使 a 成为可能UILabel,找到它被点击的确切位置,检查是否有链接等。寻找“UILabel Clickable”:在 UILabel 的 NSAttributedString 中创建可点击的“链接”?等等。甚至还有一些第三方库。

(以我的拙见)将其视为“黑客”。

有一个很好的WWDC 2018 Session:TextKit 最佳实践。在 2:34,它解释说,如果您需要与显示的文本进行交互,请优先UITextView选择UILabel.

有一种UITextViewDelegate方法可以做到这一点:textView(_:shouldInteractWith:in:interaction:)

请注意, aUITextView和 a的渲染存在细微差别UILabel。如果你把它们叠加起来,它们的“起点”就不一样了,布局有点不同。但是,只要稍加改动,它就可以是相同的(例如:如何使 UITextView 布局文本与 UILabel 相同?)。

另请注意,根据对可视化渲染的 a 的小修改UITextViewUILabel用户不会注意到差异(事实上,这很重要,除了使用UITextView/的本机方法UITextViewDelegate使其事后易于被其他开发人员理解之外,或者在如果您需要进行小修改,则需要几个月的时间)。

于 2019-04-25T21:03:30.527 回答