IOS - Как я могу предварительно загрузить клавиатуру?

Проблема

В большинстве приложений для iPhone в первый раз, когда клавиатура представлена ​​(по-видимому, создание клавиатуры занимает довольно много времени, даже на iPhone 4).

Большинство людей с этим согласны. Я не так, меня это очень беспокоит - и как мое приложение представлено, пользователи будут очень смущены, что ничего не происходит в течение нескольких секунд, когда они впервые нажимают на текстовое поле.


Что я пробовал

Googling вызывает одно решение - к сожалению, это недействительно с iOS 4 (см. здесь).

Я не ожидаю, что решение будет легко найти, если я смогу наложить щедрость на это сразу. Я был бы очень рад, если бы кто-то понял решение. Все, что нужно сделать, - это загрузить клавиатуру без уведомления пользователя.


Итак..

Любые идеи приветствуются. Полный, рабочий код (для iOS 4 и 5) - это награда (даже если щедрость должна прийти позже!).

Если решение найдено, я планирую создать автономный класс "KeyboardPreloader", который люди могут занести в свой проект, и предварительно загрузите клавиатуру одной строкой кода:)

Ответ 1

UIResponder + KeyboardCache был написан для решения этой проблемы.

Из этого проекта readme:

Эта категория на UIResponder дает вам простой метод +cacheKeyboard, чтобы вы могли контролировать, когда эта работа кэширования завершена. Например, если вы загружаете некоторые данные с сервера, вы можете вызвать это во время этого простоя. Существует еще один метод +cacheKeyboard:, который принимает необязательное значение BOOL. Передача YES этому методу приводит к тому, что обращение к кешу произойдет на следующей runloop. Итак, если вы выполняли анимацию непосредственно перед вызовом этого метода, она не прерывала бы эту анимацию.

Ответ 2

создавая текстовое поле firstResponder, а затем сбрасывая его в viewdidload.. это, похоже, работает без задержки, когда клавиатура снова загружается...

- (void)viewDidLoad
{
    [super viewDidLoad];

    [textField becomeFirstResponder];
    [textField resignFirstResponder];
        // Do any additional setup after loading the view, typically from a nib.
}

Ответ 3

Вот что я делаю:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Preloads keyboard so there no lag on initial keyboard appearance.
  UITextField *lagFreeField = [[UITextField alloc] init];
  [self.window addSubview:lagFreeField];
  [lagFreeField becomeFirstResponder];
  [lagFreeField resignFirstResponder];
  [lagFreeField removeFromSuperview];
}

Супер медленное отставание/задержка при начальной анимации клавиатуры UITextField

Ответ 4

Как только пользователь жалуется мое приложение медленной загрузочной клавиатуры. Вот небольшой трюк, чтобы отключить анимацию клавиатуры:

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

Он может не отвечать на вопрос напрямую, поскольку сама клавиатура находится в основном пользовательском интерфейсе для моего примера, и кэширование - это не вариант для меня. Тем не менее, общая отзывчивость улучшается.