Preciso verificar a condição de visibilidade do teclado em meu aplicativo iOS.
Pseudo-código:
if(keyboardIsPresentOnWindow) {
//Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
//Do action 2
}
Como posso verificar essa condição?
ios
objective-c
keyboard
Jitendra Singh
fonte
fonte
Respostas:
… Ou use o caminho mais fácil:
Quando você insere um textField, ele se torna o primeiro a responder e o teclado aparece. Você pode verificar o status do teclado com
[myTextField isFirstResponder]
. Se ele retornarYES
, o teclado está ativo.fonte
O código do Drawnonward é muito parecido, mas colide com o namespace do UIKit e poderia ser mais fácil de usar.
fonte
+load
é um método especial chamado pelo tempo de execução Objective-C. Ele é chamado para cada classe depois que o binário do aplicativo é carregado, mas antes que amain()
função seja inserida. Não há garantia de que um pool de liberação automática estará ativo.NSAutoreleasePool
alloc
/release
pode ser substituído cercando o código em@autoreleasepool { }
Crie um
UIKeyboardListener
quando souber que o teclado não está visível, por exemplo, ligando[UIKeyboardListener shared]
deapplicationDidFinishLaunching
.fonte
+(void)load
para chamar init nesta classe de ouvinte para que funcione genericamente como arrastar e soltar em qualquer projeto e inicializar a partir da segunda inicialização do aplicativo, em vez de você ter que se lembrar de iniciá-lo em qualquer lugar.Acho que você precisa usar as notificações fornecidas sobre o teclado:
De: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html
fonte
Implementação Swift 3
fonte
Usar a hierarquia de subvisualização da janela como indicação para exibição do teclado é um hack. Se a Apple mudar sua implementação subjacente, todas essas respostas falharão.
A maneira correta seria monitorar a exibição do teclado e ocultar notificações em todo o aplicativo, como dentro do seu App Delegate:
Em AppDelegate.h:
Em AppDelegate.m:
Então você pode verificar usando:
Deve-se observar que as notificações de exibição / ocultação do teclado não serão disparadas quando o usuário estiver usando um bluetooth ou teclado externo.
fonte
Adicionar uma extensão
Em seguida, verifique se o teclado está presente,
fonte
guard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Isto é do iOS Text Programming Guide publicado pela Apple aqui: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
Basicamente, chame "registerForKeyBoardNotifications" em seu ViewDidLoad. Então, toda vez que o teclado se torna ativo, "keyboardWasShown" é chamado. E toda vez que o teclado desaparece, "keyboardWillBeHidden" é chamado.
fonte
Agora, no iOS8, essa solução obviamente não funciona. Ele foi escrito inicialmente para IOS4 / 5.
Experimente esta solução:
fonte
Algumas observações:
O padrão recomendado para um objeto singleton seria o seguinte. dispatch_once certifica-se de que a classe seja inicializada uma vez de maneira thread-safe e a variável estática não seja visível do lado de fora. E é GCD padrão, então não há necessidade de saber sobre detalhes de baixo nível de Objective-C.
Normalmente você não quer saber apenas se o teclado está visível ou não, mas quão grande ele é. Nem todos os teclados têm o mesmo tamanho. Os teclados do iPhone são menores do que os teclados do iPad. Portanto, você deseja outra propriedade
@property (readonly, nonatomic) CGRect keyboardRect;
definida no método NoticeShowKeyboard: como este:Importante notar que o retângulo está nas coordenadas UIWindow e não respeita a rotação da tela. Assim, o chamador converteria esse retângulo chamando
Se o usuário girar a tela enquanto o teclado estiver visível, o aplicativo será informado de que o teclado está oculto e será mostrado novamente. Quando é mostrado, outras visualizações provavelmente ainda não foram giradas. Portanto, se você mesmo observar eventos de ocultar / mostrar do teclado, converta as coordenadas quando realmente precisar delas, não na notificação.
Se o usuário dividir ou desencaixar o teclado, ou usar um teclado físico, as notificações sempre mostrarão o teclado como oculto. Desencaixar ou mesclar o teclado enviará uma notificação de "teclado mostrado".
O ouvinte deve ser inicializado enquanto o teclado está oculto, caso contrário, a primeira notificação será perdida e será assumido que o teclado está oculto quando não está.
Portanto, é muito importante saber o que você realmente deseja. Este código é útil para tirar coisas do caminho do teclado (com um teclado dividido ou desencaixado, isso é responsabilidade do usuário). Não informa se o usuário pode ver um teclado na tela (no caso de um teclado dividido). Não informa se o usuário pode digitar (por exemplo, quando há um teclado físico). Olhar para outras janelas não funciona se o aplicativo criar outras janelas por conta própria.
fonte
Implementação rápida :
Como o swift não executa o método de carregamento de classe na inicialização, é importante iniciar este serviço na inicialização do aplicativo:
fonte
Esta é a minha solução, ela encapsula tudo em um único método estático e você pode chamá-lo de qualquer lugar para verificar:
fonte
E aqui está como fazer isso em Swift:
Não se esqueça de cancelar o registro:
E se você quiser dispensar o teclado ao pressionar o botão "Voltar":
fonte
Experimente esta função
}
de: iOS: Como acessar o `UIKeyboard`?
fonte
BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Se retornar YES, o teclado está ativo.
fonte
Para verificar se o teclado do tempo é exibido, podemos usar as notificações predefinidas do teclado.
UIKeyboardDidShowNotification, UIKeyboardDidHideNotification
Por exemplo, posso usar o seguinte código para ouvir a notificação do teclado
// Ouça as aparências e desaparecimentos do teclado
nos métodos, posso obter notificações
fonte
Swift 4
fonte
Você pode verificar iterativamente todas as visualizações de texto, campos de texto e rótulos nas subvisualizações de uma visualização pai para ver se algum é o primeiro a responder com algo assim:
fonte
SWIFT 4.2 / SWIFT 5
fonte
Eu acho que isso pode te ajudar,
obrigado,
Naveen Shan
fonte