swift - ScrollRectToVisible 显示匹配的搜索字符串以滚动到 UITextView 的中间 View

标签 swift uitextview scrollrect

我有一个 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 框架的底部。我希望匹配的文本出现在 View 中间。我尝试了以下有点有效的代码:

self.detailText.contentOffset.y = 200      

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

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

最佳答案

这似乎有效:

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

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

}

关于swift - ScrollRectToVisible 显示匹配的搜索字符串以滚动到 UITextView 的中间 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55329737/

相关文章:

ios - 'IBOutlet' 属性具有非可选类型 'UIButton'

swift - 在 MVVM 中清除 Collection View 的正确方法

iPhone SDK : Tab Character inside a textview

string - 如何用另一个替换字符串的第n个字符

ios - 如何获取 NSString 中子字符串的 NSRange(s)?

ios - 在 :emoji: format 中渲染表情符号

unity3d - 在Unity3D中拖拽ScrollRect(ScrollView)

c# - 如何检测 Unity3d 面板中的向上或向下滚动?

ios - SKShapeNode Circle 没有出现圆形