Как проскролить uitextview, чтобы nsrange был по центру?

Для проскроллирования 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 стал центром видимой области.