Подтвердить что ты не робот

Нежелательная автоматическая прокрутка с помощью UIScrollView и UITextFields в качестве подзадач

Версия "слишком длинная, не читаемая": есть ли способ отключить автоматическое прокручивание UIScrollView при передаче от UITextField до becomeFirstResponder?

У меня есть просмотр прокрутки с включенным пейджингом и несколькими представлениями в виде подзонов, причем каждый подчиненный контролируется собственным контроллером представления. Каждое подвью имеет UITextField.

Требование состоит в том, что когда страница прокручивается в поле зрения, это текстовое поле должно стать первым ответчиком.

Это удобно при использовании прокрутки пальцев - я использую метод делегата прокрутки scrollViewDidEndDecelerating:, чтобы знать, когда прокрутка останавливается и отображается страница, я могу сказать, что текстовое поле станет первым ответчиком.

Однако, когда просмотр прокрутки "автопрокручен", как при сообщении прокрутки в scrollRectToVisible:animated:, метод делегата прокрутки для замедления не вызывается. Я использую этот метод при прокрутке только что созданных страниц без вмешательства пользователя или когда пользователь нажимает UIPageControl.

Мое решение состояло в том, чтобы просто установить первый статус ответчика в текстовом поле, прежде чем говорить ему прокручивать изображение в виде - но кажется, что указание текстового поля, находящегося в представлении прокрутки, чтобы стать первым ответчиком, заставляет прокрутку просматривать автоматически прокрутку это видно.

Я предполагаю, что это поведение, используемое при помещении текстовых полей в ячейки таблицы (поскольку представления таблиц являются подклассами прокрутки). Если вы настроили небольшое тестовое приложение с табличным представлением и текстовое поле в ячейке таблицы, если клавиатура закроет ячейку представления таблицы, когда она станет первым ответчиком, представление таблицы автоматически прокрутит ее, чтобы быть видимым.

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

Я также должен отметить, что мой профиль прокрутки отключен по вертикальной прокрутке и только прокручивает по горизонтали.

Я тестировал в другом тестовом приложении, которое помещает текстовые поля в виде прямых представлений scrollview (нет диспетчеров представления или видов контейнера), и это происходит. Если вы скажете текстовое поле, которое находится вне экрана, чтобы стать первым ответчиком, прокрутка будет автоматически прокручиваться для вас.

Как правило, это не проблема, но, похоже, это затмевает просмотр страницы прокрутки. Когда я прокручиваю пальцем, каждый вид отскакивает и правильно центрируется. Но когда я прокручиваю прямоугольник, чтобы быть видимым с анимацией, и сообщать текстовому полю, чтобы он стал первым ответчиком, просмотр прокрутки кажется противоречивым с самим собой, и представление только прокручивается частью видимого пути и не центрируется.

Затем, если я коснусь вида, используя мой палец (не проведите пальцем или не перейдем), просмотр прокрутки вернется к первой странице.

Моя текущая работа для всего этого глупого автоматического прокрутки - использовать NSTimer, чтобы определить, когда обновлять первого ответчика.

Я выполняю ручную прокрутку кода с помощью scrollRectToVisible:animated, а затем через 0,3 секунды вызовите мой метод, чтобы обновить текстовое поле, чтобы быть первым ответчиком. (0,3 секунды было проб и ошибок, пытаясь увидеть, что, казалось, было наименьшее количество времени, чтобы позволить анимацию, но все равно достаточно долго, чтобы не вызвать конфликт с прокруткой.

Как вы можете видеть, это не изящно и, вероятно, сломается.

Есть ли способ отключить поведение прокрутки UIScrollView при сообщении UITextField to becomeFirstResponder?

4b9b3361

Ответ 1

Не ответ на ваш вопрос, но он должен исправить проблему:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
  // Make the text field first responder...
}

Ответ 2

Вызов beFirstResponder, затем сразу же установите для параметра contentOffset прокрутки в текущую позицию.

[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];