Retraso / retraso súper lento en la animación inicial del teclado de UITextField

169

Muy bien, este problema me ha estado volviendo loco.

Después de tocar mi teclado, el teclado aparece aproximadamente de 3 a 4 segundos UITextField. Esto solo ocurre la primera vez que aparece el teclado desde que se lanzó la aplicación, luego la animación comienza instantáneamente.

Al principio pensé que era un problema cargar demasiadas imágenes, o mi UITableView, pero acabo de crear un nuevo proyecto con solo un UITextField, y todavía tengo este problema. Estoy usando iOS 5, Xcode ver 4.2 y ejecuto un iPhone 4S.

Este es mi código:

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 280, 30)];
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.delegate = self;
    [self.view addSubview:textField];
}

@end

¿Es este un problema común para todas las aplicaciones?

En este momento, la única forma en que puedo mejorarlo es textFieldconvirtiéndome en el primer respondedor viewDidAppear, pero eso no resuelve el problema por completo, solo carga el retraso cuando se carga la vista. Si hago clic textFieldinmediatamente cuando se carga la vista, sigo teniendo el problema; Si espero 3-4 segundos después de que se carga la vista antes de tocar el campo de texto, no recibo el retraso.

Vadoff
fuente

Respuestas:

291

Antes de implementar cualquier truco exótico para solucionar este problema, intente esto: detenga la sesión de depuración, cierre la aplicación de multitarea, desconecte su dispositivo de la computadora y ejecute la aplicación normalmente tocando su icono. He visto al menos dos casos en los que el retraso solo ocurre mientras el dispositivo está enchufado.

Ceniza
fuente
2
Esta fue la respuesta correcta en mi caso en un iPhone 5 con iOS 8.1: estaba experimentando un retraso de aproximadamente 1 segundo para el primer teclado.
bejonbee
77
Sí, el retraso ocurre solo cuando se depura. Extraño.
Pauls
16
Gracias. Este problema todavía está presente en iOS 9.1 / Xcode 7.1, Swift 2.1.
Yaroslav
44
FYVM Apple, FYVM. 90 minutos de tiempo en una fecha límite que no puedo pagar. 20 votos a favor si pudiera. Todavía presente en iOS9.2 / Xcode 7.2
BaseZen
1
Esto fue exactamente lo que fue mi problema también. Después de desconectarme de mi Mac no hubo demora (ios9) xcode 7.2
desuso Darren
148

Entonces, el problema NO se limita a la primera instalación como había pensado anteriormente, sino que ocurre cada vez que se inicia la aplicación. Aquí está mi solución que resuelve el problema por completo.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Preloads keyboard so there's no lag on initial keyboard appearance.
  UITextField *lagFreeField = [[UITextField alloc] init];
  [self.window addSubview:lagFreeField];
  [lagFreeField becomeFirstResponder];
  [lagFreeField resignFirstResponder];
  [lagFreeField removeFromSuperview];
}
Vadoff
fuente
1
Agradable y simple @Vadoff: esta es una versión en línea del ejemplo UIResponder + KeyboardCache que se muestra a continuación
amergin
44
Esto debería haber sido manejado por el sistema operativo ... pero bueno: /
chakrit
9
¡Gracias! El problema aún persiste en iOS8 desafortunadamente, pero esta
solución
1
@Vadoff Solution funciona, pero tengo 2 desventajas: 1) Tengo aproximadamente 1 segundo extra de carga de la aplicación; 2) Advertencia de memoria recibida (pero no todo el tiempo). Traté de agregar este código a UIViewController en viewDidLoad, pero no tuve ningún efecto, ¿tal vez hice algo mal? ¿Podría editar su respuesta y agregar código para el controlador de vista, si esto es posible?
Dima Deplov
16
El hecho de que esta sea la respuesta correcta y funcione me hace llorar. Tuve que ducharme después de aplicar este truco.
Bill Burgess
27

Sí, también tuve un retraso de unos segundos en el último iPhone 4s. No entres en pánico. Por alguna razón, solo ocurre la primera vez que la aplicación se carga desde Xcode en Debug. Cuando hice Release, no recibí el retraso. Solo olvídalo ...

Hola Mundo
fuente
66
Es debido al nivel de optimización: Fastest, Smallest [-Os]. Puedes cambiarloBuild Settings > Optimization Level
Carlos Ricardo
20

Este es un problema conocido.

Precargar el teclado parece prometedor. Marque Precargar el UIKeyboard.

Algún material de lectura adicional:

La pantalla inicial del teclado virtual del iPhone es lenta para un UITextField. ¿Se requiere este truco?

¿Teclado UITextField bloquea runloop mientras se carga?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/12114-uitextfield-loooong-delay-when-first-tapped.html

Rok Jarc
fuente
3
Gracias, muchos de los enlaces mencionan que el retraso es de "1 segundo en los iPhone más antiguos", "no tan notable en el 3g" y "se carga instantáneamente en dispositivos nuevos", pero estoy experimentando un retraso mucho mayor de 3-4 segundos en un iphone 4s. Intentaré precargar el teclado a continuación, pero me preocupa que algo más pueda ser un problema (¿tal vez ios5 o mi xcode ver?).
Vadoff
¿Intentó cómo se comporta UITextField y el teclado en una aplicación nativa? Asegúrese de eliminarlo de la memoria antes de esta prueba (haga doble clic en el botón de inicio ...). No hay nada de malo en el código que publicaste y 3-4 segundos realmente parecen demasiado, demasiado. Nunca probé esta precarga pero parece la única solución.
Rok Jarc
Sí, el campo Buscar textField for Maps abre el teclado instantáneamente cuando se hace clic después del lanzamiento. Lo eliminé de la memoria y lo intenté varias veces, es instantáneo cada vez. No estoy seguro de qué pasa por qué el mío es tan lento.
Vadoff
Acabo de hacer una prueba en una de mis aplicaciones que usan UITextField: el retraso realmente debería ser mínimo. El código que publicó parece estar bien, por lo que debe haber algo más que frene el hilo principal. Este podría ser un buen momento para lanzar los infames instrumentos.
Rok Jarc
23
Bien, para cualquier otra persona que parezca tener este problema. Descubrí que solo sucedió la primera vez que la aplicación se actualizó en el iPhone desde xcode. Una vez que la aplicación se carga en el iPhone, cualquier uso posterior con la aplicación dará como resultado un comportamiento normal (eliminé el programa de la memoria varias veces / reinicié mi iPhone para asegurarme).
Vadoff
18

Puede usar la solución de Vadoff en Swift agregando esto a didFinishLaunchingWithOptions:

// Preloads keyboard so there's no lag on initial keyboard appearance.
let lagFreeField: UITextField = UITextField()
self.window?.addSubview(lagFreeField)
lagFreeField.becomeFirstResponder()
lagFreeField.resignFirstResponder()
lagFreeField.removeFromSuperview()

Me está funcionando en iOS 8.

Greg
fuente
5

El código en bloque se agrega a la cola principal y se ejecuta de forma asincrónica. (no bloquee el hilo principal)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });
Sergey Petruk
fuente
66
Intente agregar una explicación textual que describa por qué funciona su código y no solo dígalo para que otros puedan aprender de él.
Trineo el
77
De hecho, este código bloquea el hilo principal, está enviando a la cola principal ...
Werner Altewischer
¿Conoces la diferencia entre dispatch_async / dispatch_sync? ¿Y crees que [textField BecomeFirstResponder]; Es muy difícil para el hilo principal?
Sergey Petruk
@Spetruk El hilo que llama a dispatch_async no está bloqueado, pero el hilo en el que realmente ejecuta el código definitivamente está bloqueado. Un solo subproceso no puede hacer dos cosas a la vez, por lo que este código bloquea el subproceso principal (debido a dispatch_get_main_queue) pero no bloquea el subproceso donde se llama dispatch_async.
Kevin
@Kevin, pero algo está bloqueando el hilo principal y, como resultado, la animación del teclado no funciona. Estoy de acuerdo con usted, pero mi opinión, la solución con textFiled in appDelegate huele mal.
Sergey Petruk el
1

Un problema relacionado, en el que un UIViewController tardaría en presentarse, se resolvió utilizando la fuente del sistema en lugar de una fuente personalizada en el UITextField. ¿Quizás usar la fuente del sistema también podría funcionar para este problema?

Crashalot
fuente
0

Este error parece estar solucionado en iOS 9.2.1. Desde que actualicé mi dispositivo, ya no tengo un retraso entre tocar un campo de texto y que aparezca el teclado cuando mi dispositivo está conectado a mi computadora.

Jeff Bowen
fuente
1
parece estar arreglado en el iPhone pero todavía tengo el retraso en el iPad.
Adarkas2302
0

Esta respuesta seleccionada provoca el bloqueo de BAD_EXC en iOS 11: elimine de la aplicación para corregir

Manesh
fuente
-2

Puede agregar el código siguiente cuando se cargó la vista viewController, como viewDidAppear. No solo la aplicación: didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
Tianglin
fuente