如何在iOS应用中创建内联文本锚

时间:2019-05-17 17:06:02

标签: ios uitextview

我有一个简单的iOS应用,可以将HTML样式的内容动态加载到UITextView中。

这非常有用,因为NSAttributedString处理了我需要支持的所有HTML标记,只有一种情况例外,这是用于内联文本锚点的。它可以很好地处理外部链接,但是在点击时似乎无法识别或跳转到文本锚点。

例如,如果我为视图提供以下HTML(转换为NSAttributedString):

<p><a href="#anchor1">Lorem ipsum</a> dolor sit amet, consectetur adipiscing elit. Fusce dapibus, ante et varius imperdiet, est risus tincidunt ex, non fermentum enim eros quis metus. Quisque vehicula lacus at ornare ullamcorper. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer scelerisque lectus quis libero rutrum, quis condimentum dolor porta.</p>

[lots more text]

<p><a name="anchor1">Sed</a> eros purus, lobortis a rhoncus id, facilisis ac orci. In hac habitasse platea dictumst. In sagittis in orci vitae volutpat. Quisque sollicitudin lectus at est ultrices, et volutpat diam lobortis.</p>

在这种情况下,单击Lorem ipsum链接没有任何作用,但是如果我将其href更改为某个外部URL,则会按预期触发,因此问题似乎仅是内部链接。

所以我想知道的是,是否有可能完全在UITextView中使用本地称为锚的HTML样式?如果没有,是否有其他简单的选择?

我正在使用Swift,因此最好使用该语言的答案(如果需要编码)。

1 个答案:

答案 0 :(得分:0)

我不知道任何基于HTML-仅基于JS的解决方案。

但是,如果我的应用程序没有滚动到textview的特定部分,那么我会做类似的事情。 UITextView有delegate,可让您处理单击了哪个url。

您可以使用它来获取URL。下一个问题是获取该锚标签在整个文本中的滚动偏移量。在我的脑海中,获取该信息的一种方法是在文本中搜索锚标记,然后使用this之类的NSString方法获取字符串所需的高度。使用它作为滚动偏移量。

很显然,在用户单击链接后在主线程上执行此计算将是非常糟糕的用户体验。因此,如果以适当的方式构建应用程序,则可以预先计算此高度。