Прокрутите 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)
}
}
Обратите внимание на следующее:
- использование
localizedStandardRange
при поиске, если вы хотите игнорировать диакритические знаки и регистр, и вам нужны другие специфичные для локали функции поиска. - Вызов
selectedRange
если вы хотите, чтобы соответствующий текст был выбран.
Если вы хотите получить выбранный диапазон сверху, попробуйте что-то вроде этого вместо вызова scrollRangeToVisible
:
let rect = ayatTextView.layoutManager.boundingRect(forGlyphRange: viewRange, in: ayatTextView.textContainer)
ayatTextView.contentOffset = CGPoint(x: 0, y: rect.origin.y)