将UITextView滚动到特定文本

8
我有一个UITextView,其中包含大段文本,在其上方有一个搜索字段。当搜索任何内容时,我希望UITextView可以滚动到特定的文本并进行高亮显示。并且我需要确保UITextView以这样的方式滚动,以使搜索的文本保持在第一行。
我使用属性文本填充了TextView,并添加了一些属性。我尝试获取目标文本之前的文本,并尝试添加与TextView文本开头相同的确切属性来获取其大小。
使用该高度创建一个CGPoint并设置UITextView的contentOffset。但是,TextView滚动到的位置与目标文本无关。也许我的方法是错误的,因为我没有在设置属性时获得TextView的宽度。
我的代码如下:
func goToBla() {
        if let string = ayatTextView.text {

            if let range = string.range(of: tazweedAyahas[8].text) {
                let firstPart = string[string.startIndex..<range.lowerBound]
                print("before \(tazweedAyahas[5].text) : ")
                print(firstPart)


                if let otherStr = firstPart as? NSString {
                    let paragraphStyle = NSMutableParagraphStyle()
                    paragraphStyle.alignment = .center

                    let size = otherStr.size(withAttributes: [NSAttributedStringKey.paragraphStyle: paragraphStyle,
                                                   NSAttributedStringKey.font: UIFont(name: "me_quran", size: 30)
                        ])

                    let point = CGPoint(x: 0, y: size.height)
                    ayatTextView.setContentOffset(point, animated: true)
                }


            }
        }


    }
1个回答

11

你的方法比必要的复杂了许多。使用UITextViewscrollRangeToVisible方法即可。

func goToBla() {
    if let string = ayatTextView.text, let range = string.localizedStandardRange(of: tazweedAyahas[8].text) {
        let viewRange = NSRange(range, in: string)
        ayatTextView.selectedRange = viewRange // optional
        ayatTextView.scrollRangeToVisible(viewRange)
    }
}

请注意以下内容:

  1. 如果您想忽略变音符和大小写,并且希望使用其他区域设置特定的搜索功能,请使用localizedStandardRange进行搜索。
  2. 如果您想选择匹配的文本,请调用selectedRange

如果您想获取顶部的所选范围,请尝试以下操作,而不是调用scrollRangeToVisible

let rect = ayatTextView.layoutManager.boundingRect(forGlyphRange: viewRange, in: ayatTextView.textContainer)
ayatTextView.contentOffset = CGPoint(x: 0, y: rect.origin.y)

这种方法很好用。我只遇到了一个问题。UITextView滚动并显示搜索文本,这很棒。但是我需要确保UITextView以这样的方式滚动,使得搜索文本始终停留在第一行。 - Ahsan Aasim
2
如果你在问题中提供了那个重要细节,那将非常有帮助。 - rmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接