2010-03-25 35 views
8

He estado teniendo problemas al llamar al -becomeFirstResponder en un UITextField contenido con un controlador de vista que se presenta de forma modal. Llamo a este método en el método -viewDidLoad del controlador de vista modal para que el teclado se muestre inmediatamente. Lo que esperaba es que tanto el teclado como el controlador de vista modal se animaran desde la parte inferior de la pantalla al mismo tiempo. Sin embargo, lo que estoy observando es la siguiente:Problemas de animación del teclado al llamar a becomeFirstResponder dentro de un controlador de vista modal

  1. Hay un segundo de retraso IU ~ 0,2 entre clic en el botón que llama al método -presentModalViewController:animated: en el controlador de vista de los padres y cuando el controlador de vista niño empieza a animar de forma modal.
  2. El teclado se presenta inmediatamente sin ninguna animación tan pronto como comienza la animación del controlador de vista modal.
  3. Una vez que se completa la animación del controlador de vista modal, todo lo demás parece funcionar sin problemas.
  4. Al descartar el control de vista modal, el resultado es una animación suave y sin pantalla (junto con el teclado, por coincidencia).
  5. Al hacer clic en el botón que presenta el controlador de vista modal en cualquier momento después de la primera vez, se obtiene el mismo patrón, excepto que no hay ~ 0.2 segundo de retraso de IU.

Es como si la animación del teclado y la animación del controlador de vista modal estuvieran compitiendo por algún recurso de Core Animation de nivel inferior al mismo tiempo, pero no veo por qué debería estar pasando esto. Lo que más parece corroborar esta corazonada es que si no le pido al UITextField que se convierta en el primer respondedor (es decir, si no le pido al teclado que se presente), entonces no hay absolutamente ningún desfase de UI, y el controlador de vista modal anima al instante.

Curiosamente, si hago algo como [self.textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0001]; entonces la animación del teclado ocurre casi al mismo tiempo que la animación del controlador de vista modal - es extremadamente difícil decir que no están siendo animados a la vez. cuando se ejecuta en el simulador de iPhone. Sin embargo, cuando se ejecuta en un dispositivo real, se nota fácilmente que el teclado no aparece hasta que se presenta el controlador de vista modal. Es importante destacar que, sin embargo, ya no hay más retraso en la interfaz de usuario.

¿Alguien ha experimentado algo similar a esto?

+0

¿Ha intentado utilizar un UIImageView del teclado en la animación para crear artificialmente la apariencia deseada? –

+0

En un iPhone 6s con iOS 9.3.2 estoy contento con la forma en que el teclado está animado, pero observé este retraso la primera vez que llamé a becomeFirstResponder desde viewDidLoad, también. Después de algunas pruebas descubrí que la primera presentación de teclado después del lanzamiento de la aplicación se retrasa, no importa cómo se active. Y que este retraso solo ocurre cuando se adjunta el depurador. –

Respuesta

4

Creo que tienes problemas porque estás apilando animaciones de manera efectiva. La vista de teclado está contenida en la vista modal. La vista de teclado está intentando animar su diapositiva en transición dentro del contexto de una vista que a su vez está animando una diapositiva en transición. La animación del teclado está intentando golpear un objetivo en movimiento.

La pausa es probablemente el tiempo de ejecución de la animación de transición del teclado. Estoy bastante seguro de que la animación del teclado obtiene prioridad de otras animaciones para que pueda impulsar la reorganización de la interfaz de usuario, p. desplazar una tabla para que el teclado no se superponga a la fila de la tabla editada. En cualquier caso, la animación del teclado ocurre dentro del contexto de la supervista. Esto es especialmente cierto en el caso de la vista modal.

Por lo tanto, la vista del teclado se anima deslizándose, pero debido a que la supervista todavía no está visible, no ve nada. Cuando la supervista se desliza hacia adentro, el teclado ya está presente porque su animación se completó antes de que la supervista comenzara su animación.

En resumen, no creo que pueda realmente lograr lo que quiere hacer. En cambio, creo que primero tendrá que animar la transición de vista modal, luego ejecutar la animación del teclado o tendrá que aceptar que el teclado sea inmediatamente visible.

Creo que la sugerencia de Cirrostratus es buena. Utilice una imagen del teclado que se deslizará con la vista modal y luego la cambiará inmediatamente con el teclado real.

+0

Gracias por su respuesta. Lo sospechaba mucho, pero quería asegurarme de no estar solo loco. El problema con la sugerencia de Cirrostratus es que el teclado aún se animaría una vez que el campo de texto se convirtiera en el primer respondedor. Esto se vería extraño porque la imagen que ya está allí da la ilusión de que el teclado está presente. Si hubiera una manera de presentar el teclado al instante sin animarlo, no habría ningún problema. Trataré de resolver algo. ¡Gracias! – LucasTizma

0

Intenta mover el código que envía becomeFirstResponder fuera de viewDidLoad y en viewWillAppear. Creo que está comenzando demasiado pronto, quiere que la animación del teclado suceda cuando se produce la animación que aparece en la vista.

+1

De hecho, lo intenté también pero sucede lo mismo. – LucasTizma

0

¿Está diciendo que está viendo retraso en el simulador pero no en el dispositivo? Si ese es el caso, es posible que vea un retraso debido a que su computadora está tomando tiempo para cargar todo en la memoria. Cuando carga el simulador la primera vez, no solo ejecuta el código de forma nativa, probablemente esté cargando todo tipo de bibliotecas de depuración y tiempo de ejecución. Una vez cargado en la memoria, el sistema es probablemente bastante rápido. Si está experimentando retraso en el Simulador, tal vez pueda ayudar un poco más de RAM en su máquina de desarrollo. Si su máquina tiene algunos años, puede pensar en buscar algo nuevo.

+1

El problema está presente tanto en el dispositivo como en el simulador de iPhone. Simplemente no es tan obvio en el simulador de iPhone porque es más rápido. – LucasTizma

0

Esto es lo que hice para hacer que el teclado aparece para animar exactamente el mismo tiempo que un modalviewcontroller:

En el método (init) de la vista que se presenta de forma modal, creé el UITextField y la convirtió en la primera respondedor Luego, cuando presento el controlador de vista modal con animación, ambos aparecen al mismo tiempo.

1

La animación diferida del teclado me molestó también. viewDidLayoutSubviews fue el método mágico que estaba buscando. Realizar la llamada becomeFirstResponder hace que el teclado se deslice hacia arriba en el tiempo con el modal.

https://stackoverflow.com/a/19517739/3618864

Cuestiones relacionadas