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é.
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];
}
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é.
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 ...
C'est un problème connu.
Le préchargement du clavier semble prometteur. Vérifier Précharger le UIKeyboard.
Quelques lectures supplémentaires:
L'écran initial du clavier virtuel iPhone est lent pour un UITextField. Ce hack est-il nécessaire?
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.
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];
});
Voir cette réponse . Ils suggèrent UIResponder + KeyboardCache . C'est simple et génial. Testé sur iOS 7.
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?
Cette réponse sélectionnée provoque le blocage de BAD_EXC sur iOS 11 - suppression de l'application pour réparation
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.