Супер медленное отставание/задержка при начальной анимации клавиатуры 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];
});
Ответ 7
См. этот ответ. Они предлагают UIResponder + KeyboardCache. Это просто и удивительно. Протестировано на iOS 7.
Ответ 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];