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;

ссылка: http://hayatomo.com/2014/09/26/1307

Следующие два решения не работают для меня на 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];
}];
Другие вопросы по тегам