it-swarm.com.ru

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

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

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

Сначала я подумал, что это проблема загрузки слишком большого количества изображений или моего UITableView, но я только что создал новый проект только с UITextField, и до сих пор испытываю эту проблему. Я использую iOS 5, Xcode версии 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 секунды после загрузки представления, прежде чем дотронуться до textField, я не получу задержку.

168
Vadoff

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

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

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

280
Ash

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

27
SmallChess
20
Rok Jarc

Вы можете использовать решение Vadoff в Swift, добавив его в 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()

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

17
Greg

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

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

Смотрите этот ответ . Они предлагают UIResponder + KeyboardCache . Это просто и круто. Протестировано на iOS 7.

4
zekel

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

1
Crashalot

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

0
Manesh

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

0
Jeff Bowen