Atraso / atraso super lentos na animação inicial do teclado do UITextField

169

Tudo bem, esse problema está me deixando louco.

Demora cerca de 3-4 segundos para o teclado aparecer depois que eu toco no meu UITextField. Isso ocorre apenas na primeira vez em que o teclado é exibido desde o lançamento do aplicativo, depois a animação é iniciada instantaneamente.

No começo, pensei que era problema carregar muitas imagens, ou as minhas UITableView, mas acabei de criar um projeto totalmente novo com apenas uma UITextField, e ainda sinto esse problema. Estou usando o iOS 5, Xcode ver 4.2 e executando em um iPhone 4S.

Este é o meu código:

#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

Esse é um problema comum para todos os aplicativos?

No momento, a única maneira de torná-lo um pouco melhor é ter me textFieldtornado / resignador de resposta viewDidAppear, mas isso não resolve o problema completamente - ele apenas carrega o atraso quando a exibição é carregada. Se eu clicar textFieldimediatamente quando a exibição for carregada, continuarei com o problema; se eu esperar de 3 a 4 segundos após o carregamento da visualização antes de tocar no campo de texto, não recebo o atraso.

Vadoff
fonte

Respostas:

291

Antes de implementar hacks exóticos para solucionar esse problema, tente o seguinte: interrompa a sessão de depuração, feche o aplicativo de multitarefa, desconecte o dispositivo do computador e execute o aplicativo normalmente tocando no ícone. Vi pelo menos dois casos em que o atraso ocorre apenas enquanto o dispositivo está conectado.

Cinza
fonte
2
Essa foi a resposta correta no meu caso em um iPhone 5 com iOS 8.1 - eu estava com um atraso de aproximadamente 1 segundo no primeiro teclado.
precisa saber é
7
Sim, o lagg ocorre apenas durante a depuração. Esquisito.
Pauls
16
Obrigado. Esse problema ainda está presente no iOS 9.1 / Xcode 7.1, Swift 2.1.
Yaroslav
4
FYVM Apple, FYVM. 90 minutos em um prazo que não posso pagar. 20 votos se eu pudesse. Ainda presente no iOS9.2 / Xcode 7.2
BaseZen
1
Este foi exatamente o meu problema também. Depois que eu desconectei do meu mac, não houve atraso (ios9) xcode 7.2 #
Deprecated Darren
148

Portanto, o problema NÃO se limita apenas à primeira instalação, como eu pensava anteriormente, mas acontece sempre que o aplicativo é iniciado. Aqui está a minha solução que resolve o problema completamente.

- (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];
}
Vadoff
fonte
1
Agradável e simples @Vadoff - esta é uma versão em linha do exemplo do UIResponder + KeyboardCache fornecido abaixo
amergin
4
Isso deveria ter sido tratado pelo sistema operacional ... mas tudo bem: /
chakrit
9
obrigado! problema ainda permanece no iOS8 infelizmente, mas este trabalho-around ainda resolve
hitme
1
A solução @Vadoff funciona, mas possui 2 pontos negativos: 1) Eu tenho cerca de 1 segundo extra de carregamento do aplicativo; 2) Aviso de memória recebida (mas não o tempo todo). Tentei adicionar esse código ao UIViewController no viewDidLoad, mas não teve efeito, talvez eu tenha feito algo errado? Você pode editar sua resposta e adicionar código para o controlador de exibição, se isso for possível.
Dima Deplov
16
O fato de que esta é a resposta correta e funciona me faz chorar. Eu tive que tomar um banho depois de aplicar esse truque.
Bill Burgess
27

Sim, também tive alguns segundos de atraso nos últimos 4s para iPhone. Não entre em pânico. Por alguns motivos, isso acontece apenas na primeira vez em que o aplicativo é carregado do Xcode no Debug. Quando fiz o lançamento, não recebi o atraso. Esqueça...

Olá Mundo
fonte
6
É devido ao nível de otimização: Fastest, Smallest [-Os]. Você pode alterá-loBuild Settings > Optimization Level
Carlos Ricardo
20

Este é um problema conhecido.

O pré-carregamento do teclado parece promissor. Verifica Pré-carregamento do UIKeyboard.

Algum material de leitura adicional:

A exibição inicial do teclado virtual do iPhone é lenta para um UITextField. Esse truque é necessário?

O teclado UITextField bloqueia o runloop durante o carregamento?

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

Rok Jarc
fonte
3
Obrigado, muitos dos links mencionam que o atraso é de "1 segundo em iphones mais antigos", "não tão perceptível no 3G" e "carrega instantaneamente em novos dispositivos", mas estou com um atraso muito maior de 3-4 segundos em um iphone 4s. Vou tentar pré-carregar o teclado a seguir, mas estou preocupado que outra coisa possa ser um problema (talvez ios5 ou meu xcode ver?).
Vadoff
Você tentou como o UITextField e o teclado se comportam em um aplicativo nativo? Remova-o da memória antes deste teste (clique duas vezes no botão inicial ...). Não há nada de errado com o trecho de código que você postou e 3-4 segundos realmente parecem muito - demais. Eu nunca tentei esse pré-carregamento, mas parece que a única solução alternativa.
Ano Jarc
Sim, o Search textField for Maps exibe o teclado instantaneamente quando clicado após o lançamento. Tirei-o da memória e tentei algumas vezes, é instantâneo todas as vezes. Não sei ao certo por que o meu é tão lento.
Vadoff
Acabei de fazer um teste em um dos meus aplicativos que usam UITextField - o atraso deve ser realmente mínimo. O código que você postou parece bom, então deve haver algo mais que retém o thread principal. Talvez seja um bom momento para lançar os famosos Instrumentos.
Ano Jarc
23
Ok, para qualquer pessoa que pareça ter esse problema. Descobri que isso só aconteceu na primeira vez em que o aplicativo foi atualizado no iphone a partir do xcode. Depois que o aplicativo é carregado no iphone, qualquer outro uso com o aplicativo resultará em comportamento normal (removi o programa da memória algumas vezes / reiniciei o iphone para garantir).
Vadoff
18

Você pode usar a solução de Vadoff no Swift adicionando isso a 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()

Está funcionando para mim no iOS 8.

Greg
fonte
5

Código no bloco adicionado à fila principal e executado de forma assíncrona. (não trava a linha principal)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });
Sergey Petruk
fonte
6
Tente adicionar uma explicação textual que descreva por que seu código funciona e não apenas forneça para que outras pessoas possam aprender com ele.
Trenó
7
Este código faz, de facto, bloco o segmento principal, você está despachando na fila principal ...
Werner Altewischer
você sabe a diferença entre dispatch_async / dispatch_sync? E você acha que [textField torne-sePrimeiroResponder]; é muito difícil para o thread principal?
Sergey Petruk
@ Spetruk O thread que chama o dispatch_async não está bloqueado, mas o thread no qual você realmente executa o código está definitivamente bloqueado. Um único encadeamento não pode fazer duas coisas ao mesmo tempo; portanto, esse código bloqueia o encadeamento principal (por causa de dispatch_get_main_queue), mas não bloqueia o encadeamento no qual dispatch_async é chamado.
Kevin Kevin
@ Kevin, mas algo está bloqueando o thread principal e, como resultado, a animação do teclado não está funcionando. Concordo com você, mas a minha opinião, solução com textFiled no appDelegate cheira mal.
Sergey Petruk 07/01
1

Um problema relacionado, em que um UIViewController demoraria a ser apresentado, foi resolvido usando a fonte do sistema em vez de uma fonte personalizada no UITextField. Talvez o uso da fonte do sistema também funcione para esse problema?

Crashalot
fonte
0

Este bug parece ter sido corrigido no iOS 9.2.1. Desde a atualização do meu dispositivo, não tenho mais um atraso entre tocar em um campo de texto e o teclado aparecer quando meu dispositivo está conectado ao meu computador.

Jeff Bowen
fonte
1
parece ser corrigido no iPhone, mas ainda tenho o atraso no iPad.
Adarkas2302 09/09/19
0

Esta resposta selecionada causa uma falha no BAD_EXC no iOS 11 - remover do aplicativo para corrigir

Manesh
fonte
-2

Você pode adicionar o código abaixo quando a visualização do viewController foi carregada, como viewDidAppear.Não apenas o aplicativo: didFinishLaunchingWithOptions:

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