1 votes

Clavier personnalisé (iPhone), UIKeyboardDidShowNotification et UITableViewController

Sur une application iPhone, j'ai un clavier personnalisé qui fonctionne comme le clavier standard ; il apparaît si un champ de texte personnalisé devient premier répondant et se cache si le champ abandonne le premier répondant. J'affiche également le fichier générique UIKeyboardWillShowNotification , UIKeyboardDidShowNotification et leurs équivalents cachés, comme suit :

NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:5];
[userInfo setObject:[NSValue valueWithCGPoint:self.center]
             forKey:UIKeyboardCenterBeginUserInfoKey];
[userInfo setObject:[NSValue valueWithCGPoint:shownCenter]
             forKey:UIKeyboardCenterEndUserInfoKey];
[userInfo setObject:[NSValue valueWithCGRect:self.bounds]
             forKey:UIKeyboardBoundsUserInfoKey];
[userInfo setObject:[NSNumber numberWithInt:UIViewAnimationCurveEaseOut]
             forKey:UIKeyboardAnimationCurveUserInfoKey];
[userInfo setObject:[NSNumber numberWithDouble:thisAnimDuration]
             forKey:UIKeyboardAnimationDurationUserInfoKey];

[[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification
                                                    object:nil
                                                  userInfo:userInfo];

Ce code fonctionne et je l'utilise dans UIViewController sous-classes.

Depuis que l'iPhone OS 3.0 , UITableViewController redimensionne automatiquement son tableView lorsque les claviers du système s'affichent et se cachent. Je ne compile que maintenant avec la version 3.0 et je pensais que le contrôleur devrait également redimensionner la table si mon clavier personnalisé apparaît, puisque j'affiche la même notification. Mais ce n'est pas le cas. Le contrôleur de la vue de la table est défini comme le délégué des champs de saisie.

Quelqu'un a-t-il une idée de la raison pour laquelle cela pourrait être le cas ? Quelqu'un a-t-il mis en œuvre quelque chose de similaire avec succès ?

J'ai des champs de saisie standard à côté des champs personnalisés, de sorte que si l'utilisateur change les champs, le clavier standard se cache et le clavier personnalisé s'affiche. Il serait avantageux que le tableView ne soit pas redimensionné à pleine hauteur et que je n'aie pas à le redimensionner avec une méthode personnalisée.

0voto

Brad The App Guy Points 13329

J'ai fait quelque chose de similaire. Si je me souviens bien, j'ai fini par faire en sorte que le TableViewController réagisse aux notifications que vous envoyez ou que le système envoie, puis anime le changement dans le cadre du tableau. Il est probable que vous faites quelque chose de similaire en interne, mais je pense que le résultat final devient simplement deux blocs d'animation enroulés l'un autour de l'autre qui s'exécutent tous deux lorsque le système envoie les notifications, mais le résultat final devrait être le même.

Dans votre vuedidLoad :

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardWillShow:) 
                                             name: UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardDidShowOrHide:) 
                                             name: UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardWillHide:) 
                                             name: UIKeyboardWillHidewNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardDidShowOrHide:) 
                                             name: UIKeyboardDidHideNotification object:nil];

et dans le contrôleur de vue :

-(void) keyboardWillShow:(id)sender {
  [UIView beginAnimations];
  [UIView setAnimationDuration:0.3];
  self.view.frame = //Your new size
}

-(void) keyboardDidShowOrHide:(id)sender {
  [UIView commitAnimations];
}

-(void) keyboardWillHide:(id)sender {
  [UIView beginAnimations];
  [UIView setAnimationDuration:0.3];
  self.view.frame = //Your old size
}

0voto

Corey Floyd Points 16747

Il y a quelques possibilités que vous pouvez explorer. D'après votre description, il semble que l'UITableView n'utilise pas les notifications de l'UIKeyboard.

Mais il est possible que ce soit le UINavigationController qui réponde à cette notification (ou le UITabBarController).

Vous pouvez remplacer des méthodes comme setFrame : drawRect : et setNeedsDisplay dans le tableau pour voir ce qui se passe dans la pile d'appels. Vous pourrez peut-être découvrir ce qui fait que le tableau se redessine à la bonne taille.

Mais selon toute vraisemblance, la solution la plus simple consiste à modifier vous-même la taille de la tableView. Ces suggestions sont juste pour le plaisir !

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