9
votes

Move up uitoolbar

J'ai un uitoolbar au bas de ma vue et j'ai un Uitextfield dans cette barre d'outils. Lorsque je commence à éditer ce champ, il est caché derrière le clavier. Pour voir ce que j'ai tapé, je souhaite déplacer la barre d'outils au moment du moment où le clavier est présenté (puis le déplace vers le bas lorsque j'ai fini d'édition).

Comment puis-je déplacer cet uitoolbar haut / bas?


2 commentaires

Dupliquer de stackoverflow.com/questions/1247113 / ...


Pas un duplicata. Cette question concerne la barre d'outils et non le champ de texte.


5 Réponses :


13
votes

Ajoutez votre classe ViewController à la liste des observateurs de uikeyboardwillshownotification code> / uikeyboardwillhidenotification code>. Ensuite, vous pouvez déplacer votre vue pour rendre votre texte visible. Vous pouvez également obtenir des paramètres d'animation à partir de ces notifications pour synchroniser votre animation avec les paramètres d'animation du clavier de la version actuelle du système d'exploitation. ce code que j'ai utilisé pour la pagination

- (void) returnMainViewToInitialposition:(NSNotification*)aNotification{
    NSDictionary* userInfo = [aNotification userInfo];
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardBoundsUserInfoKey] getValue:&keyboardFrame];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];
    [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y + keyboardFrame.size.height, self.view.frame.size.width, self.view.frame.size.height)];
    [UIView commitAnimations];
}


1 commentaires

Merci pour la belle solution. Mais j'ai toujours du mal à déplacer la barre d'outils. La vue se déplace mais pas la barre d'outils que j'ai créée dans la méthode ViewDidLoad . Pourriez-vous me donner un indice? Merci



8
votes

Merci cela a fonctionné! Voici une légère amélioration: xxx


0 commentaires

3
votes

Merci beaucoup pour cela; ça marche très bien. Cependant, le code tel que présenté présente 2 limitations que je leur ai vécues:

1) La vue étant repositionnée ne glisse simplement pas hors de l'écran plutôt que de redimensionner pour s'adapter à l'espace disponible après que le clavier apparaisse p>

2 ) Répéter les notifications dues aux champs de texte de commutation Continuez à appliquer le changement de trame, ce qui entraîne une volée progressivement de l'écran. P>

La cause est que ce qui précède est une repositionner par rapport à la trame actuelle de la vue plutôt que redimensionner par rapport au clavier. Voici deux lignes de code modifiées qui résolvent ceci: p>

dans LiftMainViewWhenkeyBordAppears :, redimensionner plutôt que repositionner, par rapport au clavier: p> xxx pré>

dans returnmainviewnInitialposition: , changez l'animation à cette définition: (essentiellement semblable à la transformation d'identité). P>

    [self.view setFrame:CGRectMake(self.view.frame.origin.x, 
                               self.view.frame.origin.y,
                               self.view.frame.size.width, 
                               keyboardFrame.origin.y + keyboardFrame.size.height)];


0 commentaires

0
votes

Voici une solution plus élégante utilisant la catégorie UIView xxx


0 commentaires

5
votes

Construire sur les réponses ci-dessus et en utilisant la méthode de la commodité [UIView Animatewithduration ...]. Observez les notifications du clavier Show / Masquera et utilisez ces gestionnaires.

- (void)keyboardWillShow:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    NSNumber *durationValue = info[UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curveValue = info[UIKeyboardAnimationCurveUserInfoKey];
    NSValue *endFrame = info[UIKeyboardFrameEndUserInfoKey];

    [UIView animateWithDuration:durationValue.doubleValue
                          delay:0
                        options:(curveValue.intValue << 16)
                     animations:^{
                         self.navigationController.toolbar.frame = CGRectMake(0,
                                                                              [endFrame CGRectValue].origin.y - self.navigationController.toolbar.bounds.size.height,
                                                                              self.navigationController.toolbar.bounds.size.width,
                                                                              self.navigationController.toolbar.bounds.size.height);
                     }
                     completion:nil];
}

- (void)keyboardWillHide:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    NSNumber *durationValue = info[UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curveValue = info[UIKeyboardAnimationCurveUserInfoKey];

    [UIView animateWithDuration:durationValue.doubleValue
                          delay:0
                        options:(curveValue.intValue << 16)
                     animations:^{
                         self.navigationController.toolbar.frame = CGRectMake(0,
                                                                              self.view.bounds.size.height - self.navigationController.toolbar.bounds.size.height,
                                                                              self.navigationController.toolbar.bounds.size.width,
                                                                              self.navigationController.toolbar.bounds.size.height);
                     }
                     completion:nil];
}


1 commentaires

Casting uiviewanimationCurve dans UIViewanimationOptionCurve en changeant! Comment se fait-il que je n'aurais pas pu venir avec ça !? Merci beaucoup.