UITextView setText 不应该在 ios8 中跳到顶部
Posted
技术标签:
【中文标题】UITextView setText 不应该在 ios8 中跳到顶部【英文标题】:UITextView setText should not jump to top in ios8 【发布时间】:2014-11-20 04:43:46 【问题描述】:以下 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 控制台相同的向下滚动行为。不幸的是,在我可以使用 scrollRangeToVisible 再次向下滚动之前,setText 会导致视图重置到顶部。
上面的代码在 iOS7 中解决了这个问题并且它工作了,但是在上周升级到 iOS8 之后,该解决方案似乎不再工作了。
如果没有跳跃行为,我无法弄清楚如何流畅地进行此操作?
【问题讨论】:
【参考方案1】:我也遇到了这个问题。你可以试试这个。
textView.layoutManager.allowsNonContiguousLayout = NO;
参考:http://hayatomo.com/2014/09/26/1307
【讨论】:
哇..我已经解决了很长时间了..感谢您的回答。 这节省了我几个小时,谢谢! 我在解决这个问题几个小时后发现了这个。这是正确的答案。 哥们,你真是个天才! 这是正确的答案。具体来说,在设置allowNonContiguousLayout = NO 之后,您可以更改文本视图中的文本,然后滚动。 _consoleView.text = 文本; [_consoleView scrollRangeToVisible:NSMakeRange(_consoleView.text.length - 1, 1)];【参考方案2】:以下两种解决方案不适用于 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];
];
【讨论】:
如果我使用的是 scrollEnabled = NO 和 scrollEnabled = YES 那么它在 iOS 9 上工作但在 iOS 8 上不工作,唯一适合我的解决方案是仅在 NSOperationQueue 中设置内容偏移量。值得为答案投票。【参考方案3】:尝试将文本添加到 UITextView(没有 scrollRangeToVisible/scrollEnabled)。在 iOS8 SDK 中不再需要启用/禁用滚动的破解。 UITextView 自动滚动。
【讨论】:
谢谢!自从我出于测试目的需要它以来已经有一段时间了,从那以后它就被从项目中删除了。我确实记得虽然解决了它是像这样晦涩难懂的东西。现在被接受为正确答案;-) 这不是真的,滚动对我来说不是自动的。以上是关于UITextView setText 不应该在 ios8 中跳到顶部的主要内容,如果未能解决你的问题,请参考以下文章
UITextView 在分页 UIScrollView 内滚动不起作用
UITextView:链接检测在模拟器中工作,而不是在设备上
Win32 SDK:ListBox 为什么不整个 LB_SETTEXT