Question

Dans plusieurs cas, je souhaite ajouter une barre d'outils en haut du clavier de l'iPhone (comme dans iPhone Safari lorsque vous naviguez dans des éléments de formulaire, par exemple).

Je spécifie actuellement le rectangle de la barre d’outils avec des constantes, mais comme d’autres éléments de l’interface sont en flux continu (barres d’outils et barres de navigation en haut de l’écran), chaque fois que nous modifions légèrement l’interface, la barre d’outils s’aligne.

Existe-t-il un moyen de déterminer par programme la position du clavier par rapport à la vue actuelle?

Était-ce utile?

La solution

À partir d'iOS 3.2, il existe un nouveau moyen d'obtenir cet effet:

UITextFields et UITextViews possèdent une propriété inputAccessoryView , que vous pouvez définir pour n'importe quelle vue, qui est automatiquement affichée au-dessus et animée avec le clavier. .

Notez que la vue que vous utilisez ne doit pas figurer dans la hiérarchie des vues, vous ne devez pas non plus l'ajouter à une vue d'ensemble, cela est fait pour vous.

Autres conseils

Donc en gros:

Dans la méthode init:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

Et puis avoir les méthodes mentionnées ci-dessus pour ajuster la position de la barre:

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

Pourrait le rendre joli en animant le changement de position en l’enveloppant dans

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];

Ceci est basé sur le réponse existante de tonklon - j'ajoute simplement un extrait de code qui affiche une barre d'outils noire semi-transparente au-dessus du clavier, accompagnée de la mention "terminé". bouton à droite:

UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];

UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];

NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];

[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];

[aTextField setInputAccessoryView:toolbar];

et le -resignKeyboard ressemble à:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

L’espoir qui aide quelqu'un.

Si vous vous enregistrez pour les notifications au clavier, par exemple UIKeyboardWillShowNotification UIKeyboardWillHideNotification , etc., la notification que vous recevrez contiendra les bornes du clavier dans le userInfo dict ( UIKeyboardBoundsUserInfoKey ).

Voir la référence de classe UIWindow .

Dans la version 3.0 et les versions ultérieures, vous pouvez obtenir la durée et la courbe de l'animation à partir du dictionnaire userInfo des notifications.

Par exemple, pour animer la taille de la vue afin de faire de la place pour le clavier, enregistrez-vous pour le UIKeyboardWillShowNotification et procédez comme suit:

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

Faites une animation similaire pour UIKeyboardWillHideNotification .

J'ai trouvé ce lien très utile pour comprendre, étape par étape, inputaccesoryview.

vue des accessoires d'entrée

Créez cette méthode et appelez-la sur ViewWillLoad:

        - (void) keyboardToolbarSetup
{
    if(self.keyboardToolbar==nil)
        {
        self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)];

        UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)];


        NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil];

        [self.keyboardToolbar setItems:toolbarButtons];

        self.myTextView.inputAccessoryView=self.keyboardToolbar;
        }
}

Il n’ya aucun moyen (autant que je sache) d’obtenir les dimensions de la vue clavier. Il est toutefois constant, du moins dans toutes les versions d’iPhone jusqu’à présent.

Si vous calculez la position de la barre d'outils comme un décalage par rapport au BAS de votre vue et que vous tenez compte de la taille de votre vue, vous ne devriez pas avoir à vous soucier de la présence ou non d'une barre de navigation.

ex.

#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size
#define TOOLBAR_HEIGHT 30

toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;

// move toolbar either directly or with an animation

Au lieu d’une définition, vous pouvez facilement créer une fonction keyboardHeight qui renvoie la taille en fonction de l’affichage du clavier et déplacer cette barre de positionnement dans une fonction distincte qui réorganise votre présentation. / p>

Cela peut également dépendre de l'endroit où vous faites ce positionnement car il est possible que la taille de votre vue varie entre le chargement et l'affichage en fonction de la configuration de votre barre de navigation. Je crois que le meilleur endroit pour le faire serait dans la vue à venir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top