Нежелательная автоматическая прокрутка с 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];