5

Following iOS 8 code is called every second:

- (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)];
}

The goal is to have the same scrolling down behaviour as the XCode console when the text starts running off the bottom. Unfortunately, setText causes the view to reset to the top before I can scroll down again with scrollRangeToVisible.

This was solved in iOS7 with the above code and it worked, but after upgrading last week to iOS8, that solution no longer seems to work anymore.

I can't figure out how to get this going fluently without the jumping behaviour?

3 Answers3

28

I meet this problem too. You can try this.

textView.layoutManager.allowsNonContiguousLayout = NO;

refrence:http://hayatomo.com/2014/09/26/1307

frank
  • 2,327
  • 1
  • 18
  • 20
3

The following two solutions don't work for me on iOS 8.0.

textView.scrollEnabled = NO;
[textView.setText: text];
textView.scrollEnabled = YES;

and

CGPoint offset = textView.contentOffset;
[textView.setText: text];
[textView setContentOffset:offset];

I setup a delegate to the textview to monitor the scroll event, and noticed that after my operation to restore the offset, the offset is reset to 0 again. So I instead use the main operation queue to make sure my restore operation happens after the "reset to 0" option.

Here's my solution that works for iOS 8.0.

CGPoint offset = self.textView.contentOffset;
self.textView.attributedText = replace;
[[NSOperationQueue mainQueue] addOperationWithBlock: ^{
    [self.textView setContentOffset: offset];
}];
Harper
  • 1,794
  • 14
  • 31
  • If I'm using scrollEnabled = NO and scrollEnabled = YES then its working on iOS 9 but not on iOS 8 and the only solution that work's for me is setting content offset in NSOperationQueue only. Deserve up-voting for the answer. – MilanPanchal Dec 22 '15 at 11:43
-2

Try just to add text to UITextView (without scrollRangeToVisible/scrollEnabled). It seams that hack with scroll enabled/disabled is no more needed in iOS8 SDK. UITextView scrolls automatically.

  • Thanks! It's been a while since I needed this for testing purposes, and since then it's been removed from the project. I do remember though that it was something obscure like this that solved it though. Accepted as correct answer for now ;-) – Wouter Scholtens Nov 27 '14 at 10:20
  • This is not true, the scroll is not automatic for me. – mikemeli Dec 18 '15 at 00:38