将 UITextView 滚动到特定文本

Scroll UITextView to specific text

我有一个带有大文本的 uitextview,在上面我有一个搜索字段。搜索任何内容,我希望 uitextview 滚动到该特定文本和高亮显示。而且我需要确保 uitextview 以搜索到的文本停留在第一行的方式滚动

我用带有某些属性的属性文本填充了文本视图。我尝试的是在目标文本之前获取文本并尝试获取它的大小添加我在开始时添加到 textview 文本上的确切属性。

使用该高度制作了一个 CGPoint 并设置了 uitextview 的 contentOffset。但是文本视图在目标文本附近没有滚动。也许我的方法是错误的,因为我在设置属性时没有 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)
                }


            }
        }


    }

您的方法比需要的复杂得多。使用UITextView.

scrollRangeToVisible方法
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)