Super slow lag / delay przy początkowej animacji klawiatury UITextField

Dobra, ten problem doprowadza mnie do szału.

Po dotknięciu mojego UITextField klawiatura wyskakuje około 3-4 sekund. Dzieje się tak tylko przy pierwszym uruchomieniu klawiatury od momentu uruchomienia aplikacji, a następnie natychmiast rozpoczyna się animacja.

Na początku myślałem, że to problem z załadowaniem zbyt wielu obrazów, lub mojego UITableView, ale właśnie stworzyłem nowy projekt z tylko UITextField, i nadal doświadczam tego problemu. Używam iOS 5, Xcode ver 4.2 i działa na iPhone 4S.

To jest mój kod:

#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

Czy jest to powszechny problem dla wszystkich aplikacji?

W tej chwili jedynym sposobem, w jaki mogę to poprawić, jest posiadanie textField become / resign first responder in viewDidAppear, ale to nie rozwiązuje problemu całkowicie - po prostu ładuje opóźnienie, gdy Widok się ładuje. Jeśli kliknę na textField natychmiast po załadowaniu widoku, nadal mam problem; jeśli poczekam 3-4 sekundy po załadowaniu widoku przed dotknięciem pola tekstowego, nie dostanę opóźnienie.

Author: Brian, 2012-02-20

11 answers

Zanim zaimplementujesz jakieś egzotyczne hacki, aby obejść ten problem, spróbuj tego: zatrzymaj sesję debugowania, zamknij aplikację z wielozadaniowości, odłącz urządzenie od komputera i uruchom aplikację normalnie, dotykając jej ikony. Widziałem co najmniej dwa przypadki, w których opóźnienie występuje tylko podczas podłączania urządzenia.

 279
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-15 15:49:38

Więc problem nie ogranicza się tylko do pierwszej instalacji, jak wcześniej myślałem, ale dzieje się za każdym razem, gdy aplikacja jest uruchamiana. Oto moje rozwiązanie, które całkowicie rozwiązuje problem.

- (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];
}
 147
Author: Vadoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-09 19:52:22

Tak, mam też kilkusekundowe opóźnienie na najnowszym iPhonie 4s. nie panikuj. Z pewnych powodów zdarza się to tylko po raz pierwszy aplikacja jest ładowana z Xcode w debugowaniu. Kiedy zwolniłem, nie mam opóźnienia. Zapomnij o tym...

 27
Author: SmallChess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-24 08:00:25
 20
Author: Rok Jarc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:32

Możesz użyć rozwiązania Vadoffa w języku Swift, dodając to do 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()
To działa dla mnie w iOS 8.
 16
Author: ScreenWatcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 17:05:30

Kod w bloku dodany do kolejki main I uruchamiany asynchronicznie. (nie blokuj głównego wątku)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });
 5
Author: Sergey Petruk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 06:39:10

Zobacz tę odpowiedź . Sugerują UIResponder+KeyboardCache . To proste i niesamowite. Testowane na iOS 7.

 4
Author: zekel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:16

Powiązany problem, w którym Kontroler UIViewController byłby powolny, został rozwiązany za pomocą czcionki systemowej zamiast niestandardowej w polu UITextField. Być może użycie czcionki systemowej również zadziała na ten problem?

 1
Author: Crashalot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 22:36:11

Ten błąd wydaje się być naprawiony w iOS 9.2.1. Od aktualizacji urządzenia nie ma już opóźnienia między dotknięciem pola tekstowego a pojawieniem się klawiatury, gdy urządzenie jest podłączone do komputera.

 0
Author: Jeff Bowen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-29 18:55:36

W tym celu należy skontaktować się z firmą BAD_EXC, aby dowiedzieć się więcej o firmie BAD_EXC.]}

 0
Author: Manesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-06 13:04:38

Możesz dodać poniższy kod, gdy Widok viewcontrollera został załadowany, jak viewDidAppear.Nie tylko aplikacja:didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
 -2
Author: tianglin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 03:55:45