UITextView setText не должен прыгать на вершину в ios8
Следующий код iOS 8 вызывается каждую секунду:
- (void)appendString(NSString *)newString toTextView:(UITextView *)textView {
textView.scrollEnabled = NO;
textView.text = [NSString stringWithFormat:@"%@%@%@", textView.text, newString, @"\n"];
textView.scrollEnabled = YES;
[textView scrollRangeToVisible:NSMakeRange(textView.text.length, 0)];
}
Цель состоит в том, чтобы иметь такое же поведение прокрутки вниз, как и в консоли XCode, когда текст начинает бегать снизу. К сожалению, setText заставляет представление сброситься к вершине, прежде чем я смогу снова прокрутить вниз с помощью scrollRangeToVisible.
Это было решено в iOS7 с помощью приведенного выше кода, и это сработало, но после обновления на прошлой неделе до iOS8 это решение больше не работает.
Я не могу понять, как сделать это свободно без прыжкового поведения?
3 ответа
Попробуйте просто добавить текст в UITextView (без scrollRangeToVisible/scrollEnabled). Похоже, что взломать с включенной / отключенной прокруткой больше не требуется в iOS8 SDK. UITextView прокручивается автоматически.
Я тоже сталкиваюсь с этой проблемой. Вы можете попробовать это.
textView.layoutManager.allowsNonContiguousLayout = NO;
Следующие два решения не работают для меня на iOS 8.0.
textView.scrollEnabled = NO;
[textView.setText: text];
textView.scrollEnabled = YES;
а также
CGPoint offset = textView.contentOffset;
[textView.setText: text];
[textView setContentOffset:offset];
Я настроил делегата в textview для отслеживания события прокрутки и заметил, что после моей операции по восстановлению смещения смещение снова сбрасывается до 0. Поэтому я вместо этого использую основную очередь операций, чтобы убедиться, что моя операция восстановления происходит после опции "сброс к 0".
Вот мое решение, которое работает для iOS 8.0.
CGPoint offset = self.textView.contentOffset;
self.textView.attributedText = replace;
[[NSOperationQueue mainQueue] addOperationWithBlock: ^{
[self.textView setContentOffset: offset];
}];