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?
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.
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];
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.
Si vous vous inscrivez aux notifications du clavier, par exemple UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
, etc., la notification que vous recevez contiendra les limites du clavier dans le userInfo
dict (UIKeyboardBoundsUserInfoKey
).
Voir la référence de classe UIWindow
.
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
.
J'ai trouvé ce lien très utile pour comprendre étape par étape inputaccesoryview.
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;
}
}