56 votes

Comment créer un clavier personnalisé

Comment puis-je créer un clavier personnalisé qui s'affiche lorsque quelqu'un tape sur un UITextField ? Je voudrais afficher un clavier avec a, b, c, 1, 2, 3 et un bouton d'entrée, rien d'autre. Le clavier devrait fonctionner et se comporter comme le clavier standard (en termes de comportement), mais son apparence sera certainement différente.

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

38voto

Jonah Points 11568

Je pense que vous cherchez le " Guide de programmation texte, web et édition pour iOS "

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

Pour obtenir cette fonctionnalité si votre application utilise les objets UITextView et UITextField pour l'édition de texte, il suffit d'attribuer des vues personnalisées aux propriétés inputView et inputAccessoryView. Ces vues personnalisées sont affichées lorsque l'objet texte devient le premier intervenant...


Cela pourrait servir de bonne introduction : personnaliser le clavier iOS

5voto

Mithu Points 443

Vous pouvez utiliser Claviers personnalisés sur Github.

3voto

GeT Points 486

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

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

Après cela, je le configure 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];  

Lorsque je clique dans le champ, je fais défiler la vue pup (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];

Lorsque l'édition est 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 fixées 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;

2voto

lnafziger Points 18241

Malheureusement, le "Text, Web, and Editing Programming Guide for iOS" mentionné ci-dessus ne donne aucune information sur ce qu'il faut faire avec le caractère une fois que vous avez appuyé sur une touche. C'est de loin la partie la plus difficile de l'implémentation d'un clavier dans iOS.

J'ai créé un exemple fonctionnel complet d'un pavé numérique hexagonal qui peut facilement être personnalisé en fonction de vos besoins.

Les détails spécifiques se trouvent dans mon autre réponse sur ce sujet : https://stackoverflow.com/a/13351686/937822

2voto

bshirley Points 5561

Vous voulez 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é. La vue sera placée au-dessus du clavier du système et arrivera et sera rejetée avec lui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X