0

我有一个用来显示详细文本的 UiTextView。有时文本可能足够长以滚动浏览它。有时文本可能足够短,以至于它适合 UITextView 的框架。

我还实现了一种搜索功能,可以用来搜索更长的文本字符串。该函数将字体颜色属性添加到与搜索输入字符串匹配的文本中。该函数为每个匹配的搜索字符串输入收集一组 NSRange 值。我正在使用正则表达式来匹配搜索字符串并为每个匹配返回 NSRange 值的数组。

我目前正在开发一个将用户动画到匹配搜索字符串的 UITextView 位置的函数。

稍后我将提供一个按钮,用户可以单击以循环查看匹配项。

到目前为止,一切都运行良好。请参阅下面的代码。 detailText是 UITextView:

    // rangeOfSearchText uses a regex to return the range of the match. For text purposes, the function returns the first index only. 

   let rangeOfMatch = rangeOfSearchText(searchString: self.searchText!, UIText: self.detailText.text)

   let glyRange =  self.detailText.layoutManager.glyphRange(forCharacterRange: rangeOfMatch, actualCharacterRange:nil)

   let rect =  self.detailText.layoutManager.lineFragmentRect(forGlyphAt: NSMaxRange(glyRange), effectiveRange: nil)
   self.detailText.scrollRectToVisible(rect, animated: true)

虽然代码运行良好,但匹配的文本显示在生成的 UITextView 框架的底部。我希望匹配的文本出现在视图的中间。我尝试了以下有点工作的代码:

self.detailText.contentOffset.y = 200      

仅当匹配的文本范围位于较大的多行字符串的中间时,contentOffset才能按预期工作。如果匹配的文本范围位于字符串的开头,则实现contentOffset 会将用户滚动超过匹配的文本 200。基本上,匹配的文本会滚动到视图之外。那不好。如果匹配的文本位于多行文本的末尾,则contentOffset会添加更多空格以将匹配的文本定位在视图的中间。这两种结果都是不希望的。我可以接受后者,但前者不好,因为它会将第一个匹配的文本向上滚动到视线之外。

我在堆栈溢出上搜索了类似的问题,但找不到。如果确实存在,请指出。如果没有,欢迎提出任何建议。

4

1 回答 1

0

这似乎有效:

if rect.minY >= detailText.frame.height/2 {

self.detailText.scrollRectToVisible(rect.offsetBy(dx: 0.0, dy: detailText.frame.height/2), animated: true)

}

于 2019-03-25T02:40:30.363 回答