Soporte a teclados externos en app iOS

27 de enero de 2010, Steve Jobs sube al escenario del Yerba Buena Center for the Arts de San Francisco para presentar la primera generación de un nuevo dispositivo, el iPad. Desde entonces ha tenido gran importancia dentro del ecosistema de Apple, habiendo sufrido importantes cambios tanto en tamaño como en características técnicas. Ha llegado a competir de tu a tu contra PC y Mac en algunos casos.

Cada generación de iPad venía acompañada de accesorios, entre ellos un teclado. Todos los modelos, incluyendo el original, son compatibles con teclados bluetooth. Aunque no ha sido hasta estas últimas generaciones en las que iPad con teclado se convierte en una herramienta de trabajo, gracias al potente hardware y a las sucesivas mejoras en iOS.

Desde el punto de vista de desarrollo, añadir soporte a tu applicación para teclados externos/bluetooth es sencillo. Para ello usaremos las APIs de UIResponder.

Trabajando con UIResponder

Los objectos responder, que son instancias de UIResponder, constituyen la columna vertebral del manejo de eventos en UIKit. Las principales clases dentro de UIKit tales como UIApplication, UIViewController y UIView son tambien objetos responder. A medida que un evento ocurre, UIKit lo envia a los responder de la app para que lo traten.

En concreto, dentro de la variada API de UIResponder, para dar soporte a teclados externos nos interesa la variable var keyCommands: [UIKeyCommand]?, la cual representa los comandos de teclas que ejectutan una acción en ese UIResponder.

Cuando ocurre una combinación de teclas que encaja con un keyCommand, UIKit busca por la cadena de responders un objeto que encaje con esa combinación, después, llama al primer objeto que encuentra y para el procesamiento del evento.

Para crear un UIKeyCommand utilizaremos el inicializador init(input: String, modifierFlags: UIKeyModifierFlags, action: Selector), siendo:

  • input: Identificador la tecla presionada.
  • modifierFlags: Teclas modificadoras tales como Shift, control…
  • action: Función a ejecutar
override var keyCommands: [UIKeyCommand]? {
		
	    let deleteInputKey: String = "\u{8}"
		        
        var keyCommands: [UIKeyCommand] = []
        
        keyCommands.append(
            UIKeyCommand(input: "\u{8}",
                         modifierFlags: [],
                         action: #selector(deleteKeyPressed),
                         discoverabilityTitle: "Delete")
        )
        
        
         keyCommands.append(          
             UIKeyCommand(input: UIKeyCommand.inputEscape,
                          modifierFlags: [],
                          action: #selector(escapeKeyPressed),
                          discoverabilityTitle: "Cancel")
         )
        
        
        return keyCommands
    }
UIResponder iOS keyboard

La API de UIKeyCommand es muy variada y sencilla a la vez. Permite de manera rápida añadir incluso atajos de teclado:

override var keyCommands: [UIKeyCommand]? {
	var keyCommands: [UIKeyCommand] = []
	
	// Comando + Escape
	keyCommands.append(
		UIKeyCommand(input: UIKeyCommand.inputEscape",
		modifierFlags: [.command],
   		action: #selector(deleteKeyPressed),
		discoverabilityTitle: "Command + Escape")
	)
		
	return keyCommands
}

Si bien esta API es bastante potente y sencilla, tiene limitaciones. Por ejemplo, saber cuando el usuario suelta una tecla. Espero que habiendo mostrado lo facil que es añadir soporte para teclados externos en iOS, cada vez más aplicaciones se animen a soportarlo.

Deja un comentario

¿Necesitas una estimación?

Calcula ahora

Centro de preferencias de privacidad

Cookies propias

__unam, gdpr 1P_JAR, DV, NID, _icl_current_language

Cookies de analítica

Estas cookies nos ayudan a comprender cómo los usuarios interactúan con nuestra página web.

_ga, _gat_UA-42883984-1, _gid, _hjIncludedInSample,

Cookies de suscripción

Estas cookies se utilizan para ejecutar funciones de la Web, como no mostrar el banner publicitario y / o recordar la configuración del usuario dentro de la sesión.

tl_3832_3832_2 tl_5886_5886_12 tve_leads_unique

Otra