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.

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.


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

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...


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

20

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.


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

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?


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.


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


-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];
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.