2011-01-10 121 views
2

我正在为使用UITextView的iPad开发一个简单的文本编辑应用程序。我总是有一些UIScrollView和UITextView的问题。我想我只是从这两件事中预料到太多东西。如何完全禁用UITextView的滚动?

当我将myTextView.text设置为另一个NSString实例时,滚动会自动发生。我可以防止这种滚动设置

myTextView.scrollEnabled = NO; 
myTextView.text = newText; 
myTextView.scrollEnabled = YES; 

但是,如果我改变myTextView的财产的selectedRange,滚动发生。

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

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

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

CGPoint originalOffset = myTextView.contentOffset; 
// change myTextView.selectedRange here 
myTextView.selectedRange = originalOffset 

但没有任何结果。

2)我使用NSTimer在几秒钟后调用了上面的代码,并且正确滚动返回到原始位置(偏移)。然而,滚动到第一次发生,然后到顶部..

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

回答

9

可以禁用几乎所有通过添加如下方法到您的UITextView子滚动:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated { 
    // do nothing 
} 

我说的原因“几乎”所有的滚动是,即使上面,它仍然接受用户滚动。尽管可以通过将self.scrollEnabled设置为NO来禁用这些功能。

如果您只想禁用某些卷轴,然后制作一个ivar,让它调用acceptScrolls,以确定是否要允许滚动。然后,您的scrollRectToVisible方法可能如下所示:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated { 
    if (self.acceptScrolls) 
    [super scrollRectToVisible: rect animated: animated]; 
} 
+1

非常感谢!我从stackoverflow得到了很多帮助。希望我很快能回答很多问题! – pnmn 2011-01-10 22:54:42