Я бы сделал так, чтобы вычислить все размеры каждого абзаца.С sizeWithFont: constrainedToSize: lineBreakMode:
вы сможете определить, какой абзац видим, из [textView contentOffset].
для прокрутки, не используйте scrollRangeToVisible, просто используйте setContentOffset:Параметр y CGPoint для этого должен быть либо суммой всех высотных размеров для следующего абзаца, либо просто добавить textView.frame.size.height, если это ближе к началу следующего абзаца.
Это имеет смысл?
в ответе на комментарий, код запроса приведен ниже (не проверено):
CGFloat paragraphOffset[MAX_PARAGRAPHS];
CGSize constraint = CGSizeMake(widthOfTextView, 999999 /*arbitrarily large number*/);
NSInteger paragraphNo = 0;
CGFloat offset = 0;
for (NSString* paragraph in paragraphs) {
paragraphOffset[paragraphNo++] = offset;
CGSize paragraphSize = [paragraph sizeWithFont:textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
offset += paragraphSize.height;
}
// find visible paragraph
NSInteger visibleParagraph = 0;
while (paragraphOffset[visibleParagraph++] < textView.contentOffset.y);
// scroll to paragraph 6
[textView setContentOffset:CGPointMake(0, paragraphOffset[6]) animated:YES];