web-dev-qa-db-fra.com

Comment créer un clavier personnalisé

Comment puis-je créer un clavier/clavier personnalisé qui s'affichera lorsque quelqu'un appuiera sur un UITextField? Je voudrais afficher un clavier avec a, b, c, 1, 2, 3 et un bouton Entrée, rien d'autre. Le clavier doit fonctionner et se comporter comme le clavier standard (en comportement), mais il sera certainement différent.

Je ne trouve aucun exemple et le meilleur que j'ai trouvé est de filtrer les caractères avec le clavier existant, ce qui est une solution inacceptable.

56
HM1

Je pense que vous recherchez le " Text, Web, and Editing Programming Guide for iOS "

Le cadre UIKit inclut la prise en charge des vues d'entrée personnalisées et des vues d'accessoires d'entrée. Votre application peut substituer sa propre vue d'entrée au clavier système lorsque les utilisateurs modifient du texte ou d'autres formes de données dans une vue. Par exemple, une application peut utiliser une vue d'entrée personnalisée pour saisir des caractères d'un alphabet runique. Vous pouvez également attacher une vue d'accessoire d'entrée au clavier système ou à une vue d'entrée personnalisée; cette vue accessoire longe le haut de la vue d'entrée principale et peut contenir, par exemple, des contrôles qui affectent le texte d'une manière ou des étiquettes qui affichent des informations sur le texte.

Pour obtenir cette fonctionnalité si votre application utilise des objets UITextView et UITextField pour l'édition de texte, affectez simplement des vues personnalisées aux propriétés inputView et inputAccessoryView. Ces vues personnalisées sont affichées lorsque l'objet texte devient premier répondant ...


Cela pourrait être une bonne introduction: personnalisation du clavier iOS

38
Jonah

Vous pouvez utiliser la bibliothèque Custom-iOS-Keyboards sur Github.

5

Tout d'abord, créez une vue (je l'ai faite dans un fichier nib séparé et je l'ai chargée de cette façon):

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

Après cela, je l'ai défini comme vue d'entrée pour le champ de texte où je veux l'utiliser (et en fait, c'est la réponse courte à votre question;)):

    [self.propertyEditor setInputView:keyBView];  

En cliquant dans le champ, je fais défiler le chiot de vue (si nécessaire) pour ne pas couvrir le champ:

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];

Une fois l'édition terminée, je fais défiler la vue vers le bas:

        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];

Les contraintes que j'utilise sont définies comme suit:

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;
3
GeT

Malheureusement, le "Guide de programmation de texte, Web et édition pour iOS" référencé ci-dessus ne donne aucune information sur ce qu'il faut faire avec le personnage une fois que vous appuyez sur une touche. C'est de loin la partie difficile lors de la mise en œuvre d'un clavier dans iOS.

J'ai créé un exemple de travail complet d'un pavé numérique hexadécimal qui peut facilement être personnalisé avec ce dont vous avez besoin.

Des détails spécifiques sont à mon autre réponse à ce sujet: https://stackoverflow.com/a/13351686/937822

2
lnafziger

Vous souhaitez définir la valeur de

inputView

sur votre UITextField. Vous devrez implémenter entièrement un nouveau clavier ou mécanisme de saisie dans la vue que vous fournissez.

Alternativement,

inputAccessoryView 

peut être utilisé pour ajouter une petite quantité de fonctionnalités. La vue sera placée au-dessus du clavier système et arrivera et sera rejetée avec lui.

2
bshirley