如何完全禁用UITextView的滚动?

pnm*_*nmn 2 iphone uiscrollview uitextview ipad ios

我正在使用UITextView为iPad开发一个简单的文本编辑应用程序.我总是遇到UIScrollView和UITextView的一些问题.我想我只是期望从这两个方面得到太多东西.

当我将myTextView.text设置为另一个NSString实例时,会自动滚动.我可以通过设置来阻止这种滚动

myTextView.scrollEnabled = NO;
myTextView.text = newText;
myTextView.scrollEnabled = YES;
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改了myTextView的selectedRange属性,则会发生滚动.

具体来说,如果selectedRange的范围发生在当前屏幕中的文本上,则不会发生滚动.

例如,如果我通过点击"全选"属性选择所有文本,则不会发生滚动.但是如果我通过将selectedRange设置为NSMakeRange(0,[myTextView.text length])来选择所有文本,则滚动到END(最后一个插入位置).

为了解决这些问题,1)我保存了myTextView的原始内容偏移量.

CGPoint originalOffset = myTextView.contentOffset;
// change myTextView.selectedRange here
myTextView.selectedRange = originalOffset
Run Code Online (Sandbox Code Playgroud)

但没有任何事情发生.

2)我使用NSTimer在几秒钟后调用上面的代码,并正确滚动返回到原始位置(偏移).但是,首先滚动到最后,然后到顶部..

有没有办法完全阻止UITextView的滚动片刻?

Wil*_*sch 9

您可以通过将以下方法放入UITextView子类来禁用几乎所有滚动:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated {
  // do nothing
}
Run Code Online (Sandbox Code Playgroud)

我说"几乎"所有滚动的原因是,即使使用上述内容,它仍然接受用户滚动.虽然您可以通过将self.scrollEnabled设置为NO来禁用它们.

如果你只想禁用一些滚动,那么制作一个ivar,让我们称之为acceptScrolls,以确定是否允许滚动.然后你的scrollRectToVisible方法可能如下所示:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated {
   if (self.acceptScrolls)
     [super scrollRectToVisible: rect animated: animated];
}
Run Code Online (Sandbox Code Playgroud)