web-dev-qa-db-fra.com

Super lent lag/delay sur l'animation de clavier initiale de UITextField

D'accord, ce problème m'a rendu fou. 

Il faut environ 3 à 4 secondes au clavier pour apparaître lorsque je touche ma UITextField. Cela ne se produit que lors de la première apparition du clavier depuis le lancement de l'application, puis l'animation démarre instantanément.

Au début, je pensais que le problème était de charger trop d'images, ou ma UITableView, mais je venais de créer un tout nouveau projet avec seulement une UITextField et je rencontre toujours ce problème. J'utilise iOS 5, Xcode version 4.2 et je cours sur un iPhone 4S.

Ceci est mon code:

#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

Est-ce un problème commun à toutes les applications?

Pour le moment, la seule façon de l'améliorer est de laisser textField devenir/démissionner du premier intervenant dans viewDidAppear, mais cela ne résout pas le problème complètement - cela charge simplement le retard lorsque la vue est chargée. Si je clique sur textField immédiatement lors du chargement de la vue, le problème persiste; si j'attends 3-4 secondes après le chargement de la vue avant de toucher le champ textField, le délai n'est pas respecté.

168
Vadoff

Le problème ne se limite donc pas à la première installation, comme je le pensais auparavant, mais se produit à chaque lancement de l'application. Voici ma solution qui résout le problème complètement. 

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

Essayez d’arrêter la session de débogage, de fermer l’application du multitâche, de débrancher votre appareil de l’ordinateur et d’exécuter l’application normalement en appuyant sur son icône. J'ai vu au moins deux cas dans lesquels le délai ne se produit que lorsque le périphérique est branché.

280
Ash

Oui, j'ai aussi quelques secondes de retard sur le dernier iPhone 4s. Ne paniquez pas. Pour certaines raisons, cela ne se produit que lors du premier chargement de l'application à partir de Xcode dans Debug. Quand j'ai relâché, je ne reçois pas le retard. Oublie ça ...

27
SmallChess
20
Rok Jarc

Vous pouvez utiliser la solution de Vadoff dans Swift en ajoutant ceci à 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()

Cela fonctionne pour moi dans iOS 8.

17
Greg

Code en bloc ajouté à la file principale et exécuté de manière asynchrone. (ne pas verrouiller le fil principal)

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

Voir cette réponse . Ils suggèrent UIResponder + KeyboardCache . C'est simple et génial. Testé sur iOS 7.

4
zekel

Un problème connexe, où UIViewController serait lent à présenter, a été résolu en utilisant la police système au lieu d'une police personnalisée sur UITextField. Peut-être que l’utilisation de la police système pourrait aussi fonctionner pour ce problème?

1
Crashalot

Cette réponse sélectionnée provoque le blocage de BAD_EXC sur iOS 11 - suppression de l'application pour réparation

0
Manesh

Ce bogue semble être corrigé dans iOS 9.2.1. Depuis la mise à niveau de mon appareil, il n'y a plus de délai entre la saisie d'un champ de texte et l'apparition du clavier lorsque mon appareil est connecté à mon ordinateur.

0
Jeff Bowen