iOS - Jak mogę wstępnie załadować klawiaturę?

Problem

W większości aplikacji na iPhone ' a, jest spore opóźnienie przy pierwszym pokazaniu klawiatury (prawdopodobnie tworzenie klawiatury zajmuje sporo oomph, nawet na iPhonie 4).

Większość ludzi wydaje się w porządku z tym. Nie jestem, to naprawdę mnie denerwuje - a sposób, w jaki moja aplikacja jest prezentowana, użytkownicy będą bardzo zdezorientowani, że nic się nie dzieje przez kilka sekund, gdy po raz pierwszy dotkną pola tekstowego.


What I ' ve Tried

Googlowanie przynosi jedno rozwiązanie-niestety jest to nieprawidłowe od iOS 4 (patrz tutaj ).

Nie spodziewam się, że rozwiązanie będzie łatwe do znalezienia, gdybym mógł od razu wyłożyć na to nagrodę, zrobiłbym to. Byłbym bardzo podekscytowany, gdyby ktoś wymyślił rozwiązanie. Wszystko, co trzeba zrobić, to załadować klawiaturę bez świadomości użytkownika.


Więc..

Wszelkie pomysły są doceniane. Kompletny, działający kod (dla iOS 4 i 5) to bounty worthy (nawet jeśli bounty ma przyjść później!).

Jeśli znajdzie się rozwiązanie, planuję stworzyć samodzielną klasę 'KeyboardPreloader', którą ludzie mogą wrzucić do swojego projektu i wstępnie załadować klawiaturę jedną linijką kodu:)

Author: colincameron, 2012-02-02

4 answers

Interfejs Użytkownika + KeyboardCache został napisany w celu rozwiązania tego problemu.

Z readme tego projektu:

Ta kategoria na UIResponder daje Ci prostą metodę +cacheKeyboard, dzięki której możesz kontrolować, kiedy ta praca buforowania jest wykonywana. Na przykład, jeśli ładujesz niektóre dane z serwera, możesz je wywołać podczas tego przestoju. Istnieje inna metoda +cacheKeyboard:, która pobiera opcjonalną wartość BOOL. Przekazanie tak do tej metody powoduje wywołanie cache na następny runloop. Tak więc, jeśli wykonałeś animację tuż przed wywołaniem tej metody, nie przerywasz tej animacji.

 29
Author: cbowns,
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-10-29 20:13:24

Tworzenie pola tekstowego jako pierwszego odpowiedzi, a następnie rezygnacja z niego w viewdidload.. wydaje się to działać bez opóźnień, gdy klawiatura jest ładowana ponownie...

- (void)viewDidLoad
{
    [super viewDidLoad];

    [textField becomeFirstResponder];
    [textField resignFirstResponder];
        // Do any additional setup after loading the view, typically from a nib.
}
 12
Author: Ankit Srivastava,
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-02-02 11:18:13

Oto co robię:

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

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

 6
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
2017-05-23 12:25:51

Gdy użytkownik skarży się Moja aplikacja Na wolno ładującej się klawiaturze. Oto mała sztuczka, aby wyłączyć animację klawiatury:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // ...

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(willShowKeyboard:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didShowKeyboard:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];

    // ...
}


- (void)willShowKeyboard:(NSNotification *)notification
{
    [UIView setAnimationsEnabled:NO];
}

- (void)didShowKeyboard:(NSNotification *)notification
{
    [UIView setAnimationsEnabled:YES];
}

Może nie odpowiedzieć bezpośrednio na pytanie, ponieważ sama klawiatura jest w głównym interfejsie dla mojego przykładu, a buforowanie nie jest dla mnie opcją. Niemniej jednak ogólna szybkość reakcji ulega poprawie.

 0
Author: ohho,
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-11-01 09:24:54