Necesito verificar el estado de visibilidad del teclado en mi aplicación iOS.
Pseudocódigo:
if(keyboardIsPresentOnWindow) {
//Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
//Do action 2
}
¿Cómo puedo comprobar esta condición?
ios
objective-c
keyboard
Jitendra Singh
fuente
fuente
Respuestas:
… O tomar el camino más fácil:
Cuando ingresa un campo de texto, se convierte en el primer respondedor y aparece el teclado. Puede comprobar el estado del teclado con
[myTextField isFirstResponder]
. Si regresaYES
, entonces el teclado está activo.fuente
El código de drawnonward es muy parecido, pero choca con el espacio de nombres de UIKit y podría ser más fácil de usar.
fuente
+load
es un método especial llamado por el tiempo de ejecución de Objective-C. Se llama para cada clase después de que se cargue el binario de la aplicación, pero antes demain()
que se ingrese la función. No hay garantía de que un grupo de liberación automática esté activo.NSAutoreleasePool
alloc
/release
ahora se puede reemplazar rodeando el código en@autoreleasepool { }
Cree un
UIKeyboardListener
cuando sepa que el teclado no está visible, por ejemplo, llamando[UIKeyboardListener shared]
desdeapplicationDidFinishLaunching
.fuente
+(void)load
para llamar a init en esta clase de escucha para que funcione genéricamente como arrastrar y soltar en cualquier proyecto y se inicialice desde el segundo lanzamiento de la aplicación en lugar de tener que recordar iniciarlo en cualquier lugar.Creo que debe utilizar las notificaciones que se proporcionan sobre el teclado:
De: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html
fuente
Implementación de Swift 3
fuente
Usar la jerarquía de subvista de ventana como indicación para mostrar el teclado es un truco. Si Apple cambia su implementación subyacente, todas estas respuestas se romperían.
La forma correcta sería monitorear la visualización del teclado y ocultar las notificaciones en toda la aplicación, como dentro de su Delegado de aplicación:
En AppDelegate.h:
En AppDelegate.m:
Entonces puedes verificar usando:
Debe tenerse en cuenta que las notificaciones de mostrar / ocultar el teclado no se activarán cuando el usuario esté usando un teclado bluetooth o externo.
fuente
Agregar una extensión
Luego verifique si el teclado está presente,
fuente
guard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Esto es de la Guía de programación de texto de iOS publicada por Apple aquí: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
Básicamente, llame a "registerForKeyBoardNotifications" en su ViewDidLoad. Luego, cada vez que el teclado se activa, se llama a "keyboardWasShown". Y cada vez que el teclado desaparece, se llama a "keyboardWillBeHidden".
fuente
Ahora en iOS8 esta solución, por supuesto, no funciona. Fue escrito inicialmente para IOS4 / 5.
Prueba esta solución:
fuente
Algunas observaciones:
El patrón recomendado para un objeto singleton sería el siguiente. dispatch_once se asegura de que la clase se inicialice una vez de forma segura para subprocesos y que la variable estática no sea visible en el exterior. Y es GCD estándar, por lo que no es necesario conocer detalles de bajo nivel de Objective-C.
Por lo general, no solo desea saber si el teclado es visible o no, sino qué tan grande es. No todos los teclados tienen el mismo tamaño. Los teclados de iPhone son más pequeños que los de iPad. Entonces querría otra propiedad
@property (readonly, nonatomic) CGRect keyboardRect;
que se establece en el método noticeShowKeyboard: como este:Es importante notar que el rectángulo está en las coordenadas UIWindow y no respeta la rotación de la pantalla. Entonces, la persona que llama convertiría ese rectángulo llamando
Si el usuario gira la pantalla mientras el teclado está visible, se le dirá a la aplicación que el teclado está oculto y luego se mostrará nuevamente. Cuando se muestra, lo más probable es que todavía no se hayan rotado otras vistas. Entonces, si observa que el teclado oculta / muestra eventos usted mismo, convierta las coordenadas cuando realmente las necesite, no en la notificación.
Si el usuario divide o desacopla el teclado, o usa un teclado de hardware, las notificaciones siempre mostrarán el teclado como oculto. Desacoplar o fusionar el teclado enviará una notificación de "teclado mostrado".
El oyente debe inicializarse mientras el teclado está oculto; de lo contrario, se perderá la primera notificación y se asumirá que el teclado está oculto cuando no lo esté.
Por eso es muy importante saber lo que realmente quiere. Este código es útil para mover cosas fuera del camino del teclado (con un teclado dividido o desacoplado, eso es responsabilidad del usuario). No le dice si el usuario puede ver un teclado en la pantalla (en el caso de un teclado dividido). No le dice si el usuario puede escribir (por ejemplo, cuando hay un teclado de hardware). Mirar otras ventanas no funciona si la aplicación crea otras ventanas por sí misma.
fuente
Implementación rápida :
Debido a que swift no ejecuta el método de carga de clases al inicio, es importante iniciar este servicio al iniciar la aplicación:
fuente
Esta es mi solución, encapsula todo en un solo método estático, y puede llamarlo en cualquier lugar para verificar:
fuente
Y así es como se hace en Swift:
No olvide cancelar el registro:
Y si desea cerrar el teclado al presionar el botón "Regresar":
fuente
Prueba esta función
}
desde: iOS: ¿Cómo acceder al `UIKeyboard`?
fuente
BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Si devuelve SÍ, entonces el teclado está activo.
fuente
Para comprobar si aparece el teclado meteorológico, podemos utilizar las notificaciones predefinidas del teclado.
UIKeyboardDidShowNotification, UIKeyboardDidHideNotification
Por ejemplo, puedo usar el siguiente código para escuchar la notificación del teclado
// Escuche las apariciones y desapariciones del teclado
en los métodos puedo recibir notificaciones
fuente
Rápido 4
fuente
Puede verificar iterativamente todas las vistas de texto, campos de texto y etiquetas en las subvistas de una vista principal para ver si alguna es la primera respuesta con algo como esto:
fuente
SWIFT 4.2 / SWIFT 5
fuente
Creo que esto puede ayudarte
Gracias,
Naveen Shan
fuente