Style de récupération du clavier iMessage dans une application iOS

Je me suis demandé s’il était possible de reproduire le comportement du clavier iOS5 d’Apple dans l’application Messages, sans utiliser d’appels d’API privés. Lorsque vous faites défiler le clavier dans l’application Messages, le clavier s’effondre, laissant plus d’espace pour voir les messages – essayez-le pour voir.

Je n’ai rien trouvé qui pointe vers cela sans avoir à passer par de sérieux obstacles pour obtenir une instance de la vue du clavier. Et je suis presque sûr qu’Apple ne serait pas content avec ça.

En plus de la réponse donnée ci-dessous, vous pouvez voir un projet xcode complet de mon implémentation ici: https://github.com/orta/iMessage-Style-Receding-Keyboard

Ceci est une solution incomplète, mais elle devrait vous donner un bon sharepoint départ.

Ajoutez les ivars suivants à votre UIViewController:

CGRect keyboardSuperFrame; // frame of keyboard when initially displayed UIView * keyboardSuperView; // reference to keyboard view 

Ajoutez un inputAccessoryView à votre contrôleur de texte. J’ai créé une petite vue à insérer en tant qu’accessoireView:

 accView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; accView.backgroundColor = [UIColor clearColor]; textField.inputAccessoryView = accView; 

J’ai ajouté le code ci-dessus à -(void)loadView

Inscrivez-vous pour recevoir UIKeyboardDidShowNotification et UIKeyboardDidHideNotification lorsque la vue est chargée:

 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; return; } 

Ajoutez des méthodes à spécifier comme sélecteurs pour les notifications:

 // method is called whenever the keyboard is about to be displayed - (void)keyboardWillShow:(NSNotification *)notification { // makes keyboard view visible incase it was hidden keyboardSuperView.hidden = NO; return; } // method is called whenever the keyboard is displayed - (void) keyboardDidShow:(NSNotification *)note { // save reference to keyboard so we can easily determine // if it is currently displayed keyboardSuperView = textField.inputAccessoryView.superview; // save current frame of keyboard so we can reference the original position later keyboardSuperFrame = textField.inputAccessoryView.superview.frame; return; } 

Ajoutez des méthodes pour suivre les touched et mettre à jour la vue du clavier:

 // stops tracking touches to divider - (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { CGRect newFrame; CGRect bounds = [[UIScreen mainScreen] bounds]; newFrame = keyboardSuperFrame; newFrame.origin.y = bounds.size.height; if ((keyboardSuperView.superview)) if (keyboardSuperFrame.origin.y != keyboardSuperView.frame.origin.y) [UIView animateWithDuration:0.2 animations:^{keyboardSuperView.frame = newFrame;} completion:^(BOOL finished){ keyboardSuperView.hidden = YES; keyboardSuperView.frame = keyboardSuperFrame; [textField resignFirstResponder]; }]; return; } // updates divider view position based upon movement of touches - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch * touch; CGPoint point; CGFloat updateY; if ((touch = [touches anyObject])) { point = [touch locationInView:self.view]; if ((keyboardSuperView.superview)) { updateY = keyboardSuperView.frame.origin.y; if (point.y < keyboardSuperFrame.origin.y) return; if ((point.y > updateY) || (point.y < updateY)) updateY = point.y; if (keyboardSuperView.frame.origin.y != updateY) keyboardSuperView.frame = CGRectMake(keyboardSuperFrame.origin.x, point.y, keyboardSuperFrame.size.width, keyboardSuperFrame.size.height); }; }; return; } 

Avertissements:

  • Lors de la première démission, le clavier revient à sa position initiale avant de quitter l'écran. Pour rendre le rejet du clavier plus fluide, vous devez d'abord créer une animation pour retirer le clavier de l'écran, puis masquer la vue. Je laisserai cette partie comme exercice aux lecteurs.
  • Je l'ai seulement testé sur le simulateur iOS 5 et avec un iPhone avec iOS 5. Je n'ai pas testé cela avec les versions antérieures d'iOS.

Le projet SlidingKeyboard que j'ai créé pour tester ce concept est disponible dans GitHub dans le répertoire des exemples de BindleKit:

https://github.com/bindle/BindleKit

Modifier: exemple de mise à jour pour traiter le premier avertissement.

Dans iOS 7, il existe une propriété keyboardDismissMode sur UIScrollView. Il suffit donc de le définir sur “UIScrollViewKeyboardDismissModeInteractive” et vous obtiendrez ce comportement. Fonctionne dans les sous-classes UIScrollView telles que UITableView.

 self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; 

Swift 3:

 tableView.keyboardDismissMode = .interactive 

Ou modifiez-le dans le storyboard (si vous l’utilisez) dans l’inspecteur d’atsortingbuts pour votre sous-classe UIScrollView.

La solution simple de Vladimir cachera le clavier pendant que l’utilisateur défile vers le bas. Toutefois, pour terminer la question concernant iMessage, afin de garder un TextField toujours visible et ancré en haut du clavier, vous devez implémenter ces méthodes:

 - (UIView *) inputAccessoryView { // Return your textfield, buttons, etc } - (BOOL) canBecomeFirstResponder { return YES; } 

Voici un bon tutoriel pour en savoir plus