web-dev-qa-db-fra.com

Aligner par programmation une barre d'outils sur le dessus du clavier de l'iPhone

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

Actuellement, je spécifie le rectangle de la barre d'outils avec des constantes, mais parce que d'autres éléments de l'interface sont en flux - barres d'outils et barres de navigation en haut de l'écran - chaque fois que nous apportons une modification mineure à l'interface, la barre d'outils se désaligne.

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

94
Rob Drimmie

Depuis iOS 3.2, il existe une nouvelle façon d'obtenir cet effet:

UITextFields et UITextViews ont une propriété inputAccessoryView, que vous pouvez définir dans 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 être dans la hiérarchie des vues ailleurs, ni l'ajouter à une vue d'ensemble, cela est fait pour vous.

142
tonklon

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 des 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

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

Ceci est basé sur la réponse existante de tonklon - J'ajoute juste un extrait de code qui montre une barre d'outils noire semi transparente en haut du clavier, ainsi qu'un bouton "terminé" sur la 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];
}

J'espère que cela aide quelqu'un.

60
phi

Si vous vous inscrivez aux notifications du clavier, par exemple UIKeyboardWillShowNotificationUIKeyboardWillHideNotification, etc., la notification que vous recevez contiendra les limites du clavier dans le userInfo dict (UIKeyboardBoundsUserInfoKey ).

Voir la référence de classe UIWindow.

24
amrox

Dans les versions 3.0 et supé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 pour faire de la place pour le clavier, enregistrez-vous pour le UIKeyboardWillShowNotification et faites quelque chose comme ceci:

- (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.

16
David Beck

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

vue accessoire d'entrée

3
Julian Osorio

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;
        }
}
0