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.

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.


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

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...


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

20

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.


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

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?


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.


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


-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];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.