Super langsame Verzögerung / Verzögerung bei der ersten Tastaturanimation von UITextField

169

Okay, dieses Problem hat mich verrückt gemacht.

Es dauert ungefähr 3-4 Sekunden, bis die Tastatur erscheint, nachdem ich meine berührt habe UITextField. Dies tritt nur beim ersten Aufrufen der Tastatur seit dem Start der App auf. Danach wird die Animation sofort gestartet.

Zuerst dachte ich, es sei ein Problem, zu viele oder meine Bilder zu laden UITableView, aber ich habe gerade ein brandneues Projekt mit nur einem erstellt UITextField, und dieses Problem tritt immer noch auf. Ich verwende iOS 5, Xcode Version 4.2 und laufe auf einem iPhone 4S.

Das ist mein 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

Ist dies ein häufiges Problem für alle Apps?

Im Moment kann ich es nur verbessern, indem ich textFieldErsthelfer geworden bin / zurückgetreten bin viewDidAppear, aber das löst das Problem nicht vollständig - es lädt nur die Verzögerung, wenn stattdessen die Ansicht geladen wird. Wenn ich beim Laden textFieldder Ansicht sofort auf klicke, wird das Problem weiterhin angezeigt. Wenn ich nach dem Laden der Ansicht 3-4 Sekunden warte, bevor ich das Textfeld berühre, wird die Verzögerung nicht angezeigt.

Vadoff
quelle

Antworten:

291

Bevor Sie exotische Hacks implementieren, um dieses Problem zu umgehen, versuchen Sie Folgendes: Beenden Sie die Debug-Sitzung, schließen Sie die App für Multitasking, trennen Sie Ihr Gerät vom Computer und führen Sie die App normal aus, indem Sie auf das entsprechende Symbol tippen. Ich habe mindestens zwei Fälle gesehen, in denen die Verzögerung nur auftritt, während das Gerät angeschlossen ist.

Asche
quelle
2
Dies war in meinem Fall auf einem iPhone 5 mit iOS 8.1 die richtige Antwort. Bei der ersten Tastatur trat eine Verzögerung von etwa 1 Sekunde auf.
Bejonbee
7
Ja, die Verzögerung tritt nur beim Debuggen auf. Seltsam.
Pauls
16
Danke dir. Dieses Problem ist unter iOS 9.1 / Xcode 7.1, Swift 2.1 weiterhin vorhanden.
Jaroslaw
4
FYVM Apple, FYVM. 90 Minuten Zeit für eine Frist, die ich mir nicht leisten kann. 20 Gegenstimmen, wenn ich könnte. Immer noch vorhanden in iOS9.2 / Xcode 7.2
BaseZen
1
Genau das war auch mein Problem. Nachdem ich den Stecker von meinem Mac gezogen hatte, gab es keine Verzögerung (ios9) xcode 7.2
Veraltet Darren
148

Das Problem beschränkt sich also NICHT nur auf die erste Installation, wie ich zuvor gedacht hatte, sondern tritt jedes Mal auf, wenn die App gestartet wird. Hier ist meine Lösung, die das Problem vollständig löst.

- (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
quelle
1
Nettes und einfaches @Vadoff - dies ist eine Inline-Version des unten angegebenen Beispiels für UIResponder + KeyboardCache
Amergin
4
Dies hätte vom Betriebssystem erledigt werden sollen ... aber
na ja
9
Vielen Dank! Das Problem bleibt leider immer noch auf ios8, aber diese
Problemumgehung
1
@Vadoff Solution funktioniert, hat aber 2 Minuspunkte: 1) Ich habe ungefähr 1 zusätzliche Sekunde App-Laden; 2) Speicherwarnung empfangen (aber nicht immer). Ich habe versucht, diesen Code in viewDidLoad zu UIViewController hinzuzufügen, hatte aber keine Auswirkung. Vielleicht habe ich etwas falsch gemacht? Könnten Sie Ihre Antwort bearbeiten und Code für den View Controller hinzufügen, wenn dies möglich ist?
Dima Deplov
16
Die Tatsache, dass dies die richtige Antwort ist und funktioniert, bringt mich zum Weinen. Ich musste duschen, nachdem ich diesen Hack angewendet hatte.
Bill Burgess
27

Ja, ich habe auch ein paar Sekunden Verzögerung auf dem neuesten iPhone 4s. Keine Panik. Aus bestimmten Gründen geschieht dies nur beim ersten Laden der App von Xcode in Debug. Als ich Release gemacht habe, bekomme ich keine Verzögerung. Vergiss es einfach...

Hallo Welt
quelle
6
Es liegt an der Optimierungsstufe : Fastest, Smallest [-Os]. Sie können es ändern aufBuild Settings > Optimization Level
Carlos Ricardo
20

Dies ist ein bekanntes Problem.

Das Vorladen der Tastatur scheint vielversprechend. Überprüfen Sie das Vorladen des UIKeyboards.

Einige zusätzliche Lesematerialien:

Die anfängliche Anzeige der virtuellen iPhone-Tastatur ist für ein UITextField langsam. Ist dieser Hack erforderlich?

UITextField-Tastatur blockiert Runloop beim Laden?

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

Rok Jarc
quelle
3
Vielen Dank, viele der Links erwähnen die Verzögerung als "1 Sekunde auf älteren iPhones", "nicht so auffällig auf dem 3G" und "wird sofort auf neuen Geräten geladen", aber ich habe eine viel längere Verzögerung von 3-4 Sekunden auf einem iPhone 4s. Ich werde als nächstes versuchen, die Tastatur vorzuladen, aber ich mache mir Sorgen, dass etwas anderes ein Problem sein könnte (vielleicht ios5 oder mein xcode ver?).
Vadoff
Haben Sie versucht, wie sich UITextField und Tastatur in einer nativen App verhalten? Stellen Sie sicher, dass Sie es vor diesem Test aus dem Speicher entfernen (doppelklicken Sie auf die Home-Schaltfläche ...). An dem von Ihnen geposteten Code ist nichts auszusetzen, und 3-4 Sekunden scheinen wirklich viel zu viel zu sein. Ich habe dieses Vorladen nie ausprobiert, aber es scheint die einzige Problemumgehung zu sein.
Rok Jarc
Ja, das Search textField for Maps ruft die Tastatur sofort auf, wenn Sie nach dem Start darauf klicken. Ich habe es aus dem Speicher entfernt und ein paar Mal versucht, es ist jedes Mal sofort. Ich bin mir nicht sicher, warum meine so langsam ist.
Vadoff
Habe gerade einen Test mit einer meiner Apps durchgeführt, die UITextField verwenden - die Verzögerung sollte wirklich minimal sein. Der Code, den Sie gepostet haben, scheint in Ordnung zu sein, daher muss etwas anderes den Haupt-Thread zurückhalten. Dies könnte ein guter Zeitpunkt sein, um die berüchtigten Instrumente auf den Markt zu bringen.
Rok Jarc
23
Okay, für alle anderen, die dieses Problem zu haben scheinen. Ich habe festgestellt, dass dies nur beim ersten Aktualisieren der App auf dem iPhone von xcode passiert ist. Sobald die App auf das iPhone geladen ist, führt jede weitere Verwendung mit der App zu einem normalen Verhalten (ich habe das Programm einige Male aus dem Speicher entfernt / mein iPhone neu gestartet, um sicherzugehen).
Vadoff
18

Sie können die Vadoff-Lösung in Swift verwenden, indem Sie diese zu didFinishLaunchingWithOptions hinzufügen:

// 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()

Es funktioniert für mich in iOS 8.

Greg
quelle
5

Code im Block zur Hauptwarteschlange hinzugefügt und asynchron ausgeführt. (Haupt-Thread nicht gesperrt)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });
Sergey Petruk
quelle
6
Versuchen Sie, eine Texterklärung hinzuzufügen, die beschreibt, warum Ihr Code funktioniert, und geben Sie ihn nicht nur an, damit andere daraus lernen können.
Schlitten
7
Dieser Code blockiert tatsächlich den Haupt-Thread, den Sie in der Hauptwarteschlange versenden ...
Werner Altewischer
Kennen Sie den Unterschied zwischen dispatch_async / dispatch_sync? Und denkst du [textField wird zum ersten Antwortenden]? ist sehr schwierig für den Hauptfaden?
Sergey Petruk
@Spetruk Der Thread, der dispatch_async aufruft, ist nicht blockiert, aber der Thread, auf dem Sie den Code tatsächlich ausführen, ist definitiv blockiert. Ein einzelner Thread kann nicht zwei Dinge gleichzeitig ausführen, daher blockiert dieser Code den Hauptthread (aufgrund von dispatch_get_main_queue), blockiert jedoch nicht den Thread, in dem dispatch_async aufgerufen wird.
Kevin
@ Kevin, aber etwas blockiert den Haupt-Thread und als Ergebnis funktioniert die Tastaturanimation nicht. Ich stimme Ihnen zu, aber meiner Meinung nach riecht die Lösung mit textFiled in appDelegate schlecht nach.
Sergey Petruk
1

Ein verwandtes Problem, bei dem ein UIViewController nur langsam angezeigt wird, wurde gelöst, indem die Systemschrift anstelle einer benutzerdefinierten Schrift auf dem UITextField verwendet wurde. Vielleicht funktioniert die Verwendung der Systemschriftart auch für dieses Problem?

Crashalot
quelle
0

Dieser Fehler scheint in iOS 9.2.1 behoben zu sein. Seit dem Upgrade meines Geräts habe ich keine Verzögerung mehr zwischen dem Tippen auf ein Textfeld und dem Anzeigen der Tastatur, wenn mein Gerät an meinen Computer angeschlossen ist.

Jeff Bowen
quelle
1
Es scheint auf dem iPhone behoben zu sein, aber ich habe immer noch die Verzögerung auf dem iPad.
Adarkas2302
0

Diese ausgewählte Antwort führt unter iOS 11 zum Absturz von BAD_EXC - aus der App entfernen, um das Problem zu beheben

Manesh
quelle
-2

Sie können den folgenden Code hinzufügen, wenn die Ansicht von viewController geladen wurde, z. B. viewDidAppear. Nicht nur die Anwendung: didFinishLaunchingWithOptions:

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