Как полностью отключить прокрутку UITextView? - PullRequest
2 голосов
/ 11 января 2011

Я разрабатываю простое приложение для редактирования текста для iPad, используя UITextView. У меня всегда были некоторые проблемы с UIScrollView и UITextView. Я думаю, я просто ожидал слишком многого от этих двух.

Когда я устанавливаю myTextView.text на другой экземпляр NSString, прокрутка происходит автоматически. Я мог бы предотвратить эту прокрутку, установив

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

Однако, если я изменил свойство selectedRange myTextView, прокрутка произошла.

В частности, если диапазон selectedRange имел место для текста на текущем экране, прокрутка не происходила.

Например, если я выделю весь текст, коснувшись свойства «Выбрать все», прокрутка не произойдет. Но если я выделю весь текст, установив selectedRange в NSMakeRange (0, [myTextView.text length]), то произойдет прокрутка до END (последняя позиция каретки). Чтобы решить проблемы, 1) Я сохранил исходное смещение содержимого myTextView.

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

Но ничего не произошло.

2) Я вызвал вышеуказанные коды через несколько секунд, используя NSTimer, и прокрутка правильно вернулась в исходное положение (смещение). Однако сначала произошла прокрутка до конца, а затем до самого верха.

Есть ли способ полностью предотвратить прокрутку UITextView на мгновение?

1 Ответ

9 голосов
/ 11 января 2011

Вы можете отключить почти всю прокрутку, поместив следующий метод в свой подкласс 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];
}
...