UITextView 不循环滚动

Posted

技术标签:

【中文标题】UITextView 不循环滚动【英文标题】:UITextView not scrolling in a loop 【发布时间】:2014-06-01 11:58:46 【问题描述】:

我有这个循环更新的 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 scrollRangeToVisible:NSMakeRange([[textView text] length], 0)];
    [textView setNeedsDisplay];
    [textView setNeedsLayout];
  );

文本视图随文本更新,但继续只显示顶部。

这是为 ios 7+ 编译的。

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

有什么线索吗?

【问题讨论】:

【参考方案1】:

您可能希望看到以下内容: https://github.com/steipete/PSPDFTextView

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

【讨论】:

【参考方案2】:

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

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 @iwillnotexist-idonotexist 我已经编辑了我的答案以包含解决方案的描述。感谢您的建议。 在某种程度上我不应该被感谢;我的评论文本实际上是对至少有 500 或 2000 个代表(不确定)的审阅者可用的预制回复,他们正在审查以某种方式标记的问题。但看起来响应的“好”已经得到验证。无论如何,+1。

以上是关于UITextView 不循环滚动的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView和UIPageControl的使用(实现图片的循环滚动)

有没有办法在不开始滚动的情况下显示 UITextView 的滚动指示器?

滚动 UITextView 而不换行

C# 实现richtextbox 文字自动滚动 首尾相接循环

UITextView 中不需要的滚动空间

使用 UIScrollview 滚动 UITextview