2011-01-10 38 views
55

¿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.Cómo crear un teclado personalizado

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

+0

Respondí una pregunta muy similar (vinculada en mi respuesta a continuación: http://stackoverflow.com/a/13351686/937822) que crea un teclado personalizado. Lo convertí en código abierto y lo puse en Github para que lo usen todos, y recientemente agregué un ejemplo con un teclado hexadecimal. Si solo quieres a-c y 1-3, ¡simplemente necesitarás eliminar los botones adicionales! – lnafziger

Respuesta

38

Creo que estás en busca de la

marco El UIKit "Text, Web, and Editing Programming Guide for iOS" incluye soporte para las vistas de formulario y sus puntos de vista 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 etiquetas que muestran cierta información sobre el texto.

Para obtener esta característica si su aplicación utiliza objetos UITextView y UITextField para la edición de texto, simplemente asigne vistas personalizadas a las propiedades inputView e inputAccessoryView. Estos puntos de vista personalizados se muestran cuando el objeto de texto se convierte primero en responder ...


Esto puede servir como una buena introducción: customizing the iOS keyboard

+1

Este enlace es medio útil. Te dice todo sobre cómo es posible crear un teclado personalizado y qué categorías debe aceptar tu clase de aceptación de texto para aceptar la entrada desde un teclado personalizado ... pero no te dice casi nada acerca de cómo crear la versión personalizada teclado en sí. Un enlace a algún código de ejemplo sería muy útil. –

+0

@Robert, tienes razón. No pude encontrar una respuesta y me di por vencido. Déjeme saber si usted encuentra una solución. – HM1

+2

Puse un ejemplo básico de la implementación de un par de casos en los que es posible que desee personalizar las vistas de entrada, con suerte eso es de alguna ayuda. Ver respuesta actualizada. – Jonah

3

En primer lugar crear una vista (lo hice en una separada archivo de punta y se carga de esta manera):

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

Después, me puse como vista de entrada para el campo de texto donde quiero usarlo (y, de hecho, esta es la respuesta corta a su pregunta;)) :

[self.propertyEditor setInputView:keyBView]; 

Al hacer clic en el campo que hago desplazar la vista cachorro (si es necesario) de 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]; 

Una vez finalizada la edición, hago desplazar 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 limitaciones que uso se establece 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; 
+0

Chicos cualquier mejora en esta cuestión, ya que algunos de ustedes han hecho algunas investigaciones (y podría haber encontrado una solución), publiquen si han encontrado algo útil .... –

2

Desafortunadamente, la "Guía de programació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 trabajo de un teclado numérico hexagonal que se puede personalizar fácilmente con lo que necesite.

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

2

que desea establecer el valor de

inputView 

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

Alternativamente,

inputAccessoryView 

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

Cuestiones relacionadas