Для проскроллирования UITextView
таким образом, чтобы NSRange
был по центру, можно использовать следующий подход:
- Получите позицию начала и конца указанного
NSRange
вUITextView
с помощью методаposition(from:offset:)
иoffset(from:to:)
. Давайте назовём эти позицииstartPosition
иendPosition
, соответственно.
- Получите прямоугольник, описывающий высоту и ширину
UITextView
с помощью свойствframe
иbounds
.
- Определите центральную точку прямоугольника, используя свойства
origin
иsize
. Назовем эту точкуcenterPoint
.
- Определите прямоугольник, чей размер будет соответствовать ширине и высоте
UITextView
, с центральной точкойcenterPoint
. Это можно сделать с помощью методаCGRect.init(origin:size:)
и исходного прямоугольникаtextViewRect
.
- Рассчитайте прямоугольник, который содержит начальную и конечную позиции
startPosition
иendPosition
. Для этого вы можете использовать методunion()
прямоугольника, передавая в него прямоугольник с начальной позицией и прямоугольник с конечной позицией.
- Проскролльте
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
стал центром видимой области.