Ritardo / ritardo super slow sull'animazione della tastiera iniziale di UITextField


169

Bene, questo problema mi sta facendo impazzire.

Ci vogliono circa 3-4 secondi per far apparire la tastiera dopo aver toccato il mio UITextField. Ciò si verifica solo alla prima comparsa della tastiera dal lancio dell'app, quindi l'animazione si avvia immediatamente.

All'inizio ho pensato che fosse un problema di caricamento di troppe immagini, o mia UITableView, ma ho appena creato un progetto nuovo di zecca con solo un UITextField, e continuo a riscontrare questo problema. Sto usando iOS 5, Xcode versione 4.2 e in esecuzione su un iPhone 4S.

Questo è il mio codice:

#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

È un problema comune per tutte le app?

In questo momento, l'unico modo in cui posso renderlo un po 'migliore è textFielddiventare / dimettermi dal primo risponditore viewDidAppear, ma questo non risolve completamente il problema: carica solo il ritardo quando viene caricata la vista. Se faccio clic su textFieldimmediatamente quando viene caricata la vista, ottengo ancora il problema; se aspetto 3-4 secondi dopo il caricamento della vista prima di toccare textField, non ottengo il ritardo.

Risposte:


291

Prima di implementare eventuali hack esotici per aggirare questo problema, provare questo: interrompere la sessione di debug, chiudere l'app dal multitasking, scollegare il dispositivo dal computer ed eseguire l'app normalmente toccando la sua icona. Ho visto almeno due casi in cui il ritardo si verifica solo mentre il dispositivo è collegato.


2
Questa è stata la risposta corretta nel mio caso su un iPhone 5 con iOS 8.1: ho riscontrato un ritardo di circa 1 secondo per la prima tastiera.
Bejonbee,

7
Sì, il ritardo si verifica solo durante il debug. Strano.
Pauls,

16
Grazie. Questo problema è ancora presente su iOS 9.1 / Xcode 7.1, Swift 2.1.
Yaroslav,

4
FYVM Apple, FYVM. 90 minuti di tempo entro una scadenza che non posso permettermi. 20 voti se potessi. Ancora presente in iOS9.2 / Xcode 7.2
BaseZen

1
Questo era esattamente anche il mio problema. Dopo che ho disconnesso dal mio mac non ci sono stati ritardi (ios9) xcode 7.2
Deprecated Darren,

148

Quindi il problema NON si limita alla prima installazione come avevo pensato in precedenza, ma si verifica ogni volta che l'app viene avviata. Ecco la mia soluzione che risolve completamente il problema.

- (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];
}

1
Simpatico e semplice @Vadoff - questa è una versione incorporata dell'esempio UIResponder + KeyboardCache riportato di seguito
amergin

4
Questo avrebbe dovuto essere gestito dal sistema operativo ... ma vabbè: /
chakrit

9
Grazie! il problema persiste su iOS8 purtroppo, ma questa soluzione
alternativa

1
La soluzione @Vadoff funziona, ma ha 2 svantaggi: 1) Ho circa 1 secondo in più di caricamento dell'app; 2) Ricevuto avviso di memoria (ma non sempre). Ho provato ad aggiungere questo codice a UIViewController in viewDidLoad, ma non ho avuto alcun effetto, forse ho sbagliato qualcosa? Potresti modificare la tua risposta e aggiungere il codice per visualizzare il controller, se possibile.
Dima Deplov,

16
Il fatto che questa sia la risposta corretta e funzioni mi fa piangere. Ho dovuto fare una doccia dopo aver applicato questo trucco.
Bill Burgess,

27

Sì, ho anche avuto qualche secondo di ritardo sull'ultimo iPhone 4s. Non fatevi prendere dal panico. Per alcuni motivi, succede solo la prima volta che l'app viene caricata da Xcode in Debug. Quando ho rilasciato Release, non ho il ritardo. Lascia perdere...


6
E 'a causa del livello di ottimizzazione: Fastest, Smallest [-Os]. Puoi cambiarloBuild Settings > Optimization Level
Carlos Ricardo, l'

20

3
Grazie, molti dei link menzionano il ritardo di circa "1 secondo su iPhone più vecchi", "non così evidente sul 3G" e "carica istantaneamente su nuovi dispositivi" ma sto riscontrando un ritardo molto più lungo di 3-4 secondi su un iPhone 4s. Proverò a precaricare la tastiera dopo, ma sono preoccupato che qualcos'altro potrebbe essere un problema (forse iOS5 o la mia ver di xcode?).
Vadoff,

Hai provato come si comportano UITextField e la tastiera in un'app nativa? Assicurati di rimuoverlo dalla memoria prima di questo test (fai doppio clic sul pulsante Home ...). Non c'è niente di sbagliato nel pezzo di codice che hai pubblicato e 3-4 secondi sembrano davvero molto - troppo. Non ho mai provato questo precarico, ma sembra l'unica soluzione.
Rok Jarc,

Sì, il campo Cerca testo per Mappe consente di visualizzare immediatamente la tastiera quando si fa clic dopo l'avvio. L'ho rimosso dalla memoria e ho provato alcune volte, è istantaneo ogni volta. Non sono sicuro di cosa accada perché il mio è così lento.
Vadoff,

Ho appena fatto un test su una delle mie app che usano UITextField - il ritardo dovrebbe essere davvero minimo. Il codice che hai pubblicato sembra a posto, quindi ci deve essere qualcos'altro che trattiene il thread principale. Questo potrebbe essere un buon momento per lanciare gli famigerati strumenti.
Rok Jarc,

23
Va bene, per chiunque sembri avere questo problema. Ho scoperto che è successo solo la prima volta che l'app è stata aggiornata su iPhone da xcode. Una volta che l'app viene caricata sull'iPhone, qualsiasi ulteriore utilizzo con l'app comporterà un comportamento normale (ho rimosso il programma dalla memoria alcune volte / riavviato il mio iPhone per essere sicuro).
Vadoff,

18

Puoi utilizzare la soluzione di Vadoff in Swift aggiungendo questo 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()

Funziona per me in iOS 8.


5

Codice nel blocco aggiunto alla coda principale ed eseguito in modo asincrono. (non bloccare il thread principale)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });

6
Prova ad aggiungere una spiegazione testuale che descriva il motivo per cui il tuo codice funziona e non solo darlo in modo che altri possano imparare da esso.
Slitta,

7
Questo codice infatti blocca il thread principale, che stai
inviando

conosci la differenza tra dispatch_async / dispatch_sync? E pensi che [textField diventaFirstResponder]; è molto difficile per il thread principale?
Sergey Petruk,

@Spetruk Il thread che chiama dispatch_async non è bloccato, ma il thread su cui si esegue effettivamente il codice è decisamente bloccato. Un singolo thread non può fare due cose contemporaneamente, quindi questo codice blocca il thread principale (a causa di dispatch_get_main_queue) ma non blocca il thread in cui viene chiamato dispatch_async.
Kevin,

@Kevin ma qualcosa sta bloccando il thread principale e di conseguenza l'animazione della tastiera non funziona. Sono d'accordo con te, ma la mia opinione, la soluzione con textFiled in appDelegate ha un cattivo odore.
Sergey Petruk,


1

Un problema correlato, in cui un UIViewController sarebbe lento a presentare, è stato risolto utilizzando il font di sistema anziché un font personalizzato su UITextField. Forse l'utilizzo del font di sistema potrebbe funzionare anche per questo problema?


0

Questo bug sembra essere stato corretto in iOS 9.2.1. Da quando ho aggiornato il mio dispositivo, non ho più un ritardo tra il tocco di un campo di testo e la tastiera che appare quando il mio dispositivo è collegato al mio computer.


1
sembra essere riparato su iPhone ma ho ancora il ritardo sull'iPad.
Adarkas2302,

0

Questa risposta selezionata provoca l'arresto anomalo di BAD_EXC su iOS 11: rimuovi dall'app per risolvere


-2

Puoi aggiungere il codice seguente quando la vista di viewController è stata caricata, come viewDidAppear.Non solo applicazione: didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.