我想对 UITextView 进行某种类型的刷新,以将 textview 设置回其原始状态。我有一个段落会根据用户单击的 TableViewCell 动态填充。因此,当他们滚动文本字段,然后返回并选择另一个单元格并返回时,文本会更改,但滚动位置会在用户离开时保持不变。如何将其恢复为默认状态。谢谢!
7 回答
默认状态下,你的意思是滚动到顶部吗?如果是这样,你就在正确的轨道上。尝试
[myTextView scrollRangeToVisible:NSMakeRange(0, 0)];
我发现如果我先清除 UITextView 然后应用新文本,它会自动“滚动”回顶部。
myTextView.text = @"";
myTextView.text = theRealTextContent;
如果您希望它向上滚动到顶部,则此方法有效:
[theTextView scrollRangeToVisible:NSMakeRange(0, 0)];
唯一的问题是,这会使它向上移动。如果您希望它捕捉到顶部,请使用以下命令:
[theTextView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
[textview setScrollEnabled:YES];
textview.text = yourText;
[textview setScrollEnabled:NO];
这些方法中的任何一种都没有让我满意。
scrollRangeToVisible 会产生大量的视觉伪影(在大字符串之间切换时会出现大量滚动),事实上,在内容更改后的一段时间(我使用了 0.1 秒)的延迟调用中,它根本不工作,而不是像 Shaggy Frog 的回答所暗示的那样直接.
在设置新内容之前将文本设置为 @"" 没有帮助,即使有延迟。
似乎一旦输入了 UITextView,它就永远处于这种设置新内容会导致烦人的滚动伪影的模式下。我也尝试将 selectionRange 设置为 UITextView 的开头,但这没有帮助。在设置新内容之前发送 resignFirstResponder 消息也没有帮助。
因此,我决定在每次更改内容时删除并重新创建 UITextView。在我的应用程序中,这是一个非常罕见的事件(基于人类交互),它不是性能问题。这是我能找到的将新内容“加载”到 UITextView 中而没有大量烦人的滚动伪影的唯一方法。
我的经验是使用 OS3.2(ipad 模拟器)
我设法得到了想要的结果——在编辑结束时强制 UITextView '滚动'到其内容的顶部。但要实现它,我必须在 textViewDidEndEditing 中禁用滚动,并且还必须以相同的方法重置文本。
我在 textViewDidBeginEditing 中重新启用滚动。
- (void) textViewDidEndEditing: textView;
{
[textView setScrollEnabled: NO];
NSString* savedText = [textView text];
[textView setText:@""];
[textView setText: savedText];
}
最终对我有用的是什么来清除文本内容,然后在下一个运行循环中将其设置为所需的文本。
// clear the text view
self.textView.text = ""
// set the text on the next run loop
dispatch_async(dispatch_get_main_queue()) {
self.textView.text = someText
}