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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];
Другие вопросы по тегам