Cómo crear un teclado personalizado

¿Cómo hago para crear un teclado / teclado personalizado que aparecerá cuando alguien toque un UITextField? Me gustaría mostrar un teclado con a, b, c, 1, 2, 3 y un botón enter, nada más. El teclado debería funcionar y comportarse como lo hace el teclado estándar (en el comportamiento) pero definitivamente se verá diferente.

No puedo encontrar ningún ejemplo y lo mejor que he encontrado es filtrar caracteres con el teclado existente, que es una solución inaceptable.

Creo que estás buscando la ” Guía de progtwigción de texto, web y edición para iOS ”

El marco UIKit incluye soporte para vistas de entrada personalizadas y vistas de accesorios de entrada. Su aplicación puede sustituir su propia vista de entrada por el teclado del sistema cuando los usuarios editan texto u otras formas de datos en una vista. Por ejemplo, una aplicación podría usar una vista de entrada personalizada para ingresar caracteres de un alfabeto rúnico. También puede adjuntar una vista de accesorio de entrada al teclado del sistema oa una vista de entrada personalizada; esta vista de accesorio se ejecuta a lo largo de la parte superior de la vista de entrada principal y puede contener, por ejemplo, controles que afectan el texto de alguna manera o tags que muestran cierta información sobre el texto.

Para obtener esta característica si su aplicación utiliza objetos UITextView y UITextField para edición de texto, simplemente asigne vistas personalizadas a las propiedades inputView e inputAccessoryView. Esas vistas personalizadas se muestran cuando el objeto de texto se convierte en el primer respondedor …


Esto podría servir como una buena introducción: personalizar el teclado de iOS

Puede usar la biblioteca Custom-iOS-Keyboards en Github.

En primer lugar, cree una vista (lo hice en un archivo nib separado y lo cargué de esta manera):

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ReducedNumericKeyboardView" owner:self options:nil]; keyBView = (ReducedNumericKeyboardView*)[views objectAtIndex:0]; 

Después de esto, lo configuro como vista de entrada para el campo de texto donde quiero usarlo (y en realidad, esta es la respuesta corta a su pregunta;)):

  [self.propertyEditor setInputView:keyBView]; 

Al hacer clic en el campo, me desplazo por el cachorro de la vista (si es necesario) para no cubrir el campo:

 CGRect textFieldRect = [self.tableViewController.view.window convertRect:propertyEditor.bounds fromView:propertyEditor]; CGRect viewRect = [self.tableViewController.view.window convertRect:self.tableViewController.view.bounds fromView:self.tableViewController.view]; CGFloat midLine = textFieldRect.origin.y+.5*textFieldRect.size.height; CGFloat numerator = midLine - viewRect.origin.y - MINIMUM_SCROLL_FRACTION*viewRect.size.height; CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)*viewRect.size.height; CGFloat heightFraction = MIN(1, MAX(0, numerator/denominator)); animateDistance = floor(PORTRAIT_USER_INPUT_VIEW_HEIGHT*heightFraction); CGRect viewFrame = self.tableViewController.view.frame; viewFrame.origin.y -= animateDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION]; [self.tableViewController.view setFrame:viewFrame]; [UIView commitAnimations]; 

Cuando termina la edición, desplazo la vista hacia abajo:

  CGRect viewFrame = self.tableViewController.view.frame; viewFrame.origin.y += animateDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION]; [self.tableViewController.view setFrame:viewFrame]; [UIView commitAnimations]; 

Las restricciones que uso se establecen de la siguiente manera:

 static const CGFloat USER_INPUT_ANIMATION_DURATION = 0.3; static const CGFloat PORTRAIT_USER_INPUT_VIEW_HEIGHT = 180; static const CGFloat MINIMUM_SCROLL_FRACTION = 0.1; static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.2; 

Desea establecer el valor para

 inputView 

en su UITextField. Tendrá que implementar completamente un nuevo teclado o mecanismo de entrada en la vista que proporcione.

Alternativamente,

 inputAccessoryView 

se puede usar para agregar una pequeña cantidad de funcionalidad. La vista se colocará sobre el teclado del sistema y llegará y se descartará con ella.

Lamentablemente, la “Guía de progtwigción de texto, web y edición para iOS” mencionada anteriormente no proporciona información sobre qué hacer con el personaje una vez que presiona una tecla. Esta es la parte más difícil cuando se implementa un teclado en iOS.

He creado un ejemplo completo de funcionamiento de un teclado numérico hexagonal que se puede personalizar fácilmente con lo que necesite.

Los detalles específicos están en mi otra respuesta sobre este tema: https://stackoverflow.com/a/13351686/937822