Нежелательная автоматическая прокрутка с UIScrollView и UITextFields в качестве подпредставлений - PullRequest
25 голосов
/ 29 июня 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как видите, это не элегантно и может сломаться.

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

Ответы [ 2 ]

6 голосов
/ 29 октября 2012

ВызовитеcomeFirstResponder, а затем сразу же установите contentOffset просмотра прокрутки в его текущую позицию.

[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];
0 голосов
/ 29 июня 2010

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

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