Прокрутите UITextView к определенному тексту.

У меня есть uitextview с большими текстами и выше у меня есть поле поиска. Что-нибудь искало, я хотел бы, чтобы uitextview прокрутил к тому определенному тексту и выделил. И мне нужно убедиться, что uitextview прокручивается таким образом, что искомый текст остается в первой строке

Я заполнил текстовое представление атрибутивным текстом с некоторыми атрибутами. Я попытался получить текст перед целевым текстом и попытался получить его размер, добавив точные атрибуты, которые я добавил к текстовому тексту в начале.

сделал CGPoint, используя эту высоту, и установил contentOffset uitextview. Но текстовое представление прокручивалось не там, где рядом с целевым текстом. Может быть, мой подход неверен, так как у меня нет ширины 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 ответ

Решение

Ваш подход намного сложнее, чем должен быть. Использовать scrollRangeToVisible метод UITextView,

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)
Другие вопросы по тегам