iphone - objective - Desplazamiento automático no deseado con UIScrollView y UITextFields como subvistas
move view up when keyboard appears objective c (2)
Llame a BecomeFirstResponder, luego enseguida, establezca contentOffset del scrollview a su posición actual ..
[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];
La versión "demasiado larga; no leí": ¿Hay alguna forma de deshabilitar el comportamiento de desplazamiento automático de UIScrollView
cuando se le dice a un UITextField
de becomeFirstResponder
para que se becomeFirstResponder
en el primer becomeFirstResponder
?
Tengo una vista de desplazamiento con paginación habilitada y varias vistas como subvistas, cada una de las subvistas está controlada por su propio controlador de vista. Cada subvista tiene un UITextField.
El requisito es que cuando una página se desplaza a la vista, su campo de texto debe convertirse en el primer respondedor.
Esto está bien cuando se usa el movimiento de los dedos para desplazarse: uso el método de delegación de vista de desplazamiento scrollViewDidEndDecelerating:
para saber cuándo se detiene el desplazamiento y hay una página a la vista, puedo indicar al campo de texto que se convierta en el primer respondedor.
Sin embargo, cuando la vista de desplazamiento se "desplaza automáticamente", como cuando se le dice a scrollRectToVisible:animated:
que se scrollRectToVisible:animated:
en scrollRectToVisible:animated:
no se llama al método de delegación de vista de desplazamiento para la desaceleración. Utilizo este método al desplazar páginas recién creadas a la vista sin la interacción del usuario, o cuando el usuario toca el UIPageControl
.
Mi solución fue simplemente establecer el primer estado de respuesta del campo de texto antes de decirle que se desplace a la vista, pero parece que al indicar que un campo de texto que está en una vista de desplazamiento se convierte en el primer respondedor, la vista de desplazamiento se desplaza automáticamente a la vista .
Supongo que este es el comportamiento utilizado al colocar campos de texto en celdas de vista de tabla (ya que las vistas de tabla son subclases de vista de desplazamiento). Si configura una aplicación de prueba pequeña, con una vista de tabla y un campo de texto dentro de una celda de la tabla, si el teclado oscurece la celda de la vista de tabla cuando se convierte en el primer respondedor, la vista de la tabla lo desplazará automáticamente para que sea visible.
Sin embargo, no entiendo por qué ocurre este comportamiento en mi ejemplo, donde no estoy usando una vista de tabla, solo una vista de desplazamiento simple.
También debo mencionar que mi vista de desplazamiento tiene el desplazamiento vertical deshabilitado y solo se desplaza horizontalmente.
He probado en otra aplicación de prueba que coloca campos de texto como subvistas directas de una vista de desplazamiento (sin controladores de vista o vistas de contenedor) y sucede lo mismo. Si le dice a un campo de texto que está fuera de la pantalla que se convierta en el primer respondedor, la vista de desplazamiento lo desplazará automáticamente por usted.
Esto normalmente no sería un problema, pero parece arruinar la paginación de la vista de desplazamiento. Cuando me desplazo con el dedo, cada vista rebota y está centrada correctamente. Pero cuando desplazo un rectángulo para ser visible con animación y le digo a un campo de texto que se convierta en el primer respondedor, la vista de desplazamiento parece entrar en conflicto consigo misma y la vista solo se desplaza parte del camino a la vista, y no está centrada.
Luego, si toco una vista con el dedo (sin deslizar o incluso mover), la vista de desplazamiento vuelve a la primera página.
Mi trabajo actual para todo este comportamiento de desplazamiento automático tonto es usar un NSTimer
para determinar cuándo actualizar el primer respondedor.
Hago el desplazamiento manual en el código usando scrollRectToVisible:animated
y luego de 0,3 segundos, llame a mi método para actualizar el campo de texto para que sea el primero en responder. (0.3 segundos fueron prueba y error, tratando de ver cuál parecía ser la menor cantidad de tiempo para permitir la animación, pero aún así debería ser lo suficientemente largo como para no causar el conflicto con la vista de desplazamiento).
Como puede ver, esto no es elegante y es probable que se rompa.
¿Hay alguna forma de deshabilitar el comportamiento de desplazamiento automático de UIScrollView
cuando le dice a un UITextField
que se becomeFirstResponder
en el becomeFirstResponder
?
No es una respuesta a su pregunta, pero debería solucionar el problema:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
// Make the text field first responder...
}