Для проскроллирования UITextView
таким образом, чтобы NSRange
был по центру, можно использовать следующий подход:
1. Получите позицию начала и конца указанного NSRange
в UITextView
с помощью метода position(from:offset:)
и offset(from:to:)
. Давайте назовём эти позиции startPosition
и endPosition
, соответственно.
2. Получите прямоугольник, описывающий высоту и ширину UITextView
с помощью свойств frame
и bounds
.
3. Определите центральную точку прямоугольника, используя свойства origin
и size
. Назовем эту точку centerPoint
.
4. Определите прямоугольник, чей размер будет соответствовать ширине и высоте UITextView
, с центральной точкой centerPoint
. Это можно сделать с помощью метода CGRect.init(origin:size:)
и исходного прямоугольника textViewRect
.
5. Рассчитайте прямоугольник, который содержит начальную и конечную позиции startPosition
и endPosition
. Для этого вы можете использовать метод union()
прямоугольника, передавая в него прямоугольник с начальной позицией и прямоугольник с конечной позицией.
6. Проскролльте UITextView
к центру полученного прямоугольника, используя метод scrollRectToVisible(_:animated:)
и передавая в него прямоугольник.
Вот пример кода на Swift, реализующий описанный подход:
func scrollTextViewToCenter(textView: UITextView, range: NSRange) { let startPosition = textView.position(from: textView.beginningOfDocument, offset: range.location) let endPosition = textView.position(from: startPosition, offset: range.length) let startRect = textView.caretRect(for: startPosition!) let endRect = textView.caretRect(for: endPosition!) let textViewRect = textView.frame let centerPoint = CGPoint(x: textViewRect.width / 2, y: textViewRect.height / 2) let startCenteredRect = CGRect(origin: startRect.origin, size: CGSize(width: textViewRect.width, height: startRect.height)) let endCenteredRect = CGRect(origin: endRect.origin, size: CGSize(width: textViewRect.width, height: endRect.height)) let centeredRect = startCenteredRect.union(endCenteredRect) textView.scrollRectToVisible(centeredRect, animated: true) }
Вызов этой функции scrollTextViewToCenter(textView: UITextView, range: NSRange)
с вашим UITextView
и нужным NSRange
позволит проскроллировать UITextView
так, чтобы указанный NSRange
стал центром видимой области.