xcode - programa - iPad: detección de teclado externo
programa para controlar iphone desde pc (2)
(Esta respuesta fue sugerida por Sean Heber en los foros de Apple)
Cuando obtiene un UIKeyboardDidShowNotification
, en lugar de utilizar el marco proporcionado por UIKeyboardFrameEndUserInfoKey
, simplemente pruebe dónde está la vista de accesorios de la vista y utilícela. Todo lo que hago es comprobar para ver cuál es el marco de la vista de accesorios y convertirlo al espacio de coordenadas de mi propia vista. Entonces puedo usar fácilmente ese marco para decidir qué hacer.
Nota: Cuando el teclado en pantalla se muestra u oculta usando el botón de expulsión del teclado bluetooth, parece que UIKit envía UIKeyboardDidShowNotification
nuevamente pero no un UIKeyboardWillHideNotification
. Esto también es una inconsistencia confusa, pero la solución anterior sigue siendo válida ya que el sistema cambiará el marco de inputAccessoryView cuando se deslice en el teclado en pantalla, por lo que aún puede ajustar las cosas en consecuencia.
Mi aplicación utiliza UIAccessoryView
para proporcionar funcionalidad de teclado adicional (como pestañas hacia delante / atrás y teclas de flechas) para el teclado virtual, pero eso hace que UIKeyboardDidShowNotification se dispare incluso cuando hay un teclado físico presente (el accesorio aparece en la parte inferior de la pantalla) .
Me gustaría comprobar si un teclado físico está conectado al manejar UIKeyboardWillShowNotification, para evitar que aparezca la vista de accesorios y para evitar que mi vista personalizada se desplace hacia arriba (para dejar espacio para el teclado virtual inexistente).
Intenté examinar la clave UIKeyboardFrameEndUserInfoKey
, pero devuelve un tamaño real para el teclado virtual, a pesar de que no se muestra nada.
¿Hay alguna manera de detectar la presencia de un teclado físico para evitar este comportamiento no deseado?
Hmm, la trama se complica.
Intenté desactivar el accesorio de entrada devolviendo nil desde la propiedad inputAccessoryView del objeto Responder que desencadena el teclado. Eso suprime UIKeyboardWillShowNotification
y UIKeyboardDidShowNotification
cuando hay un teclado físico presente, pero conserva estas notificaciones cuando no existe dicho teclado. Todo bien hasta ahora.
Luego intenté volver a habilitar inputAccessoryView solo después de que se hubiera recibido UIKeyboardWillShowNotification
. Esto solo se dispara cuando se necesita un teclado virtual, por lo que debería permitirme reintroducir la vista de accesorios en esas circunstancias. O eso pensé.
Desafortunadamente, parece que el sistema operativo no comprueba inputAccessoryView después de UIKeyboardWillShowNotification
, por lo que no puede mostrar la vista de accesorios cuando es necesario: o (
Eso me deja con dos opciones:
- Incluya la vista de accesorios de entrada, brindando funcionalidad adicional para usuarios de teclado virtual, pero pierde la capacidad de detectar un teclado físico y, por lo tanto, no admite dispositivos físicos; o
- Excluya el accesorio de entrada por completo, evitando que la mayoría de los usuarios accedan a las claves adicionales, pero permitiendo que la aplicación funcione con un teclado físico.
No es una gran elección, así que todavía estoy ansioso por ver si alguien más ha abordado este problema.
Si inspecciona el marco en UIKeyboardFrameEndUserInfoKey
encontrará que está compensado por la altura del teclado cuando se conecta un teclado externo (básicamente " aparece ", pero nunca aparece sobre la parte inferior de la pantalla), por lo que puede convertir a tu espacio de coordenadas local y lo cruza con los límites de tu vista para encontrar la altura visible del teclado.
- (void)keyboardWillShow:(NSNotification *)notification {
UIView *view = [self view];
CGRect bounds = [view bounds];
CGRect keyboardFrame = [[notification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect convertedKeyboardFrame = [view convertRect:keyboardFrame fromView:nil];
CGRect intersection = CGRectIntersection(convertedKeyboardFrame, bounds);
// intersection.size.height == 0 with external keyboards
}