我有一个循环更新的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的其他答案并没有解决这个问题。
任何线索?
答案 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];
});
}