UITextView不在循环中滚动

时间:2014-06-01 11:58:46

标签: ios7 uiscrollview xcode5 uitextview uiscrollviewdelegate

我有一个循环更新的UITextView。文本将附加到每个循环的文本视图的末尾。 textview更新但不滚动显示文本视图的结尾。

我用来附加文本的方法是:

- (void)appendText:(NSString*)text toTextView:(UITextView *)textView
{
  dispatch_async(dispatch_get_main_queue(), ^{
    NSAttributedString* attr = [[NSAttributedString alloc] initWithString:text];
    [[textView textStorage] appendAttributedString:attr];
    [textView scrollRangeToVisible:NSMakeRange([[textView text] length], 0)];
    [textView setNeedsDisplay];
    [textView setNeedsLayout];
  });
}

textview会更新文字,但会继续显示顶部。

这是仅针对iOS 7+编译的。

关于SO的其他答案并没有解决这个问题。

任何线索?

2 个答案:

答案 0 :(得分:1)

你可能想看到这个: https://github.com/steipete/PSPDFTextView

基本上,您需要给UITextView一些时间来进行计算。在尝试滚动文本视图之前,请勿立即滚动,等待片刻(~0.2秒)。并且,避免在文本末尾留空行。您需要在最后一行添加至少一个字符。 (太空适合我)

答案 1 :(得分:1)

this solution无效吗? (不知道你的循环是如何实现的,我无法复制错误的行为;从NSTimer解雇你的方法对我来说很好。)

基本上,在调用scrollRangeToVisible:之前立即禁用UITextView上的滚动,然后立即重新启用滚动:

- (void)appendText:(NSString*)text toTextView:(UITextView *)textView
{
  dispatch_async(dispatch_get_main_queue(), ^{
    NSAttributedString* attr = [[NSAttributedString alloc] initWithString:text];
    [[textView textStorage] appendAttributedString:attr];
    textView.scrollEnabled = NO;
    [textView scrollRangeToVisible:NSMakeRange([[textView text] length], 0)];
    textView.scrollEnabled = YES;
    [textView setNeedsDisplay];
    [textView setNeedsLayout];
  });
}