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

Хорошо, эта проблема сводила меня с ума.

Для клавиатуры появляется примерно 3-4 секунды после того, как я коснусь своего UITextField. Это происходит только в первый раз, когда клавиатура появляется с момента запуска приложения, после чего анимация запускается мгновенно.

Сначала я думал, что проблема загрузки слишком большого количества изображений или моего UITableView, но я только что создал совершенно новый проект только с UITextField, и я все еще испытываю эту проблему. Я использую iOS 5, Xcode ver 4.2 и работает на iPhone 4S.

Это мой код:

#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

Это обычная проблема для всех приложений?

Прямо сейчас, я могу сделать это несколько лучше, это сделать textField стать/отменить первый ответчик в viewDidAppear, но это не решит проблему полностью - она ​​просто загружает задержку, когда вид нагрузки. Если я нажимаю на textField сразу после загрузки представления, у меня все еще возникает проблема; если я подождал 3-4 секунды после загрузки вида, прежде чем касаться текстового поля, я не получаю задержку.

Ответ 1

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

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

Ответ 2

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

Ответ 3

Да, я также получил несколько секунд задержки на последних iPhone 4s. Не паникуйте. По некоторым причинам это происходит только при первом загрузке приложения из Xcode в Debug. Когда я выпустил Release, я не получил задержка. Просто забудьте об этом...

Ответ 4

Это известная проблема.

Предварительная загрузка клавиатуры кажется многообещающей. Проверьте Предварительная загрузка UIKeyboard.

Некоторые дополнительные материалы для чтения:

Начальный дисплей виртуальной клавиатуры iPhone медленный для UITextField. Требуется ли это взломать?

Клавиатура UITextField блокирует runloop при загрузке?

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

Ответ 5

Вы можете использовать решение Vadoff в Swift, добавив это в doneFinishLaunchingWithOptions:

// Preloads keyboard so there no lag on initial keyboard appearance.
let lagFreeField: UITextField = UITextField()
self.window?.addSubview(lagFreeField)
lagFreeField.becomeFirstResponder()
lagFreeField.resignFirstResponder()
lagFreeField.removeFromSuperview()

Он работает для меня в iOS 8.

Ответ 6

Код в блоке добавлен в основную очередь и выполняется асинхронно. (не заблокировать основной поток)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });

Ответ 8

Связанная с этим проблема, когда UIViewController будет медленной для представления, была решена с использованием системного шрифта вместо пользовательского шрифта на UITextField. Возможно, использование этой функции также может работать для этой проблемы?

Ответ 9

Эта ошибка, как представляется, исправлена ​​в iOS 9.2.1. После обновления моего устройства у меня больше нет задержки между нажатием текстового поля и клавиатурой, появляющейся при подключении моего устройства к компьютеру.

Ответ 10

Этот выбранный ответ вызывает сбой BAD_EXC на iOS 11 - удалить из приложения для исправления

Ответ 11

Вы можете добавить ниже код при просмотре viewController, например viewDidAppear.Не просто приложение: didFinishLaunchingWithOptions:

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