SDK iOS protection du contenu sous le clavier

Parfois, le contenu du formulaire doit remplir la totalité de l'écran iOS. Alors, que faites-vous lorsque le clavier couvre votre UITextField ou UITextView? Dans cette astuce, je vais vous montrer comment utiliser un UIScrollView pour éviter que le contenu de votre formulaire ne soit masqué lorsque le clavier passe à la vue..

Selon la documentation officielle d’Apple, le meilleur moyen de contrôler une liste empilée verticalement de UITextField les objets qui peuvent être obscurcis par un clavier est de les intégrer dans un UIScrollView objet. Lorsque le clavier est affiché, un UIKeyboardDidShowNotification est envoyé et peut être utilisé pour ajuster les champs de texte affichés. Lorsque vous interceptez ce message, vous devez suivre les trois étapes suivantes:

    яя я
  1. Déterminer la taille du clavier.
  2. Mettre à jour le contenu inférieur de la vue de défilement du contenu à la hauteur du clavier.
  3. Faire défiler le contenu cible dans la vue.

Enregistrer les observateurs de clavier

Premièrement, nous devons inscrire deux observateurs pour les notifications au clavier. Un pour le UIKeyboardDidShowNotification et un pour le UIKeyboardWillHideNotification. Nous faisons cela dans le viewDidLoad: méthode, les observateurs seront donc enregistrés lors du chargement de la vue. Vous pouvez ajouter les observateurs avec le code suivant:

 [[NSNotificationCenter defaultCenter] addObserver: sélecteur automatique: @selector (keyboardWasShown :) nom: UIKeyboardDidShowNotification object: nil]; [[NSNotificationCenter defaultCenter] addObserver: sélecteur automatique: @selector (keyboardWillHide :) name: UIKeyboardWillHideNotification object: nil];

Si vous enregistrez un observateur dans le viewDidLoad: méthode, vous devez également le supprimer dans le viewDidUnload: et le dealloc: méthodes. Ajoutez donc le code suivant à ces deux méthodes:

 [[NSNotificationCenter defaultCenter] removeObserver: self];

Ajouter la méthode KeyboardWasShown

le keyboardWasSwown: la méthode répondra à la UIKeyboardDidShowNotification: notification. Dans cette méthode, nous allons implémenter les trois étapes recommandées par Apple pour déplacer le contenu. Ajoutez le code suivant à votre projet:

 - (void) keyboardWasShown: (NSNotification *) notification // Étape 1: Obtenir la taille du clavier. CGSize keyboardSize = [[[notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue] .size; // Étape 2: Ajustez le contenu inférieur de votre vue de défilement à la hauteur du clavier. UIEdgeInsets contentInsets = UIEdgeInsetsMake (0.0, 0.0, keyboardSize.height, 0.0); theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; // Étape 3: Faites défiler le champ de texte cible dans la vue. CGRect aRect = self.view.frame; aRect.size.height - = keyboardSize.height; if (! CGRectContainsPoint (aRect, activeTextField.frame.origin)) CGPoint scrollPoint = CGPointMake (0.0, activeTextField.frame.origin.y - (keyboardSize.height-15)); [theScrollView setContentOffset: scrollPoint animated: YES]; 

Dans un premier temps, nous obtenons la taille du clavier. Dans la deuxième étape, nous ajustons l'encadré de contenu inférieur de la vue de défilement à la hauteur du clavier. Dans la troisième et dernière étape, nous créons d’abord un nouveau rect avec la hauteur de l’écran moins la hauteur du clavier. Ensuite, nous vérifions si le champ de texte actif est sous le clavier. Si ce n'est pas sous le clavier, le scrollview ne mettra pas à jour le décalage de contenu. Si le champ de texte actif est sous le clavier, nous mettons à jour le décalage du contenu de la vue de défilement. J'ai utilisé (keyboardSize.height-15), de sorte que le champ de texte actif ne sera pas juste au-dessus du champ de texte, mais sera espacé de 15 pixels supplémentaires. activeTextField est une variable personnalisée qui stocke le champ actif.

Ajouter la méthode KeyboardWillHide

Nous devons également ajouter le keyboardWillHide: méthode, qui répondra à la UIKeyboardWillHideNotification. Ajoutez le code suivant à votre projet:

 - (void) keyboardWillHide: (NSNotification *) notification UIEdgeInsets contentInsets = UIEdgeInsetsZero; theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; 

Ici nous définissons le contentInset et le scrollIndicatorInsets de la vue de défilement pour UIEdgeInsetsZero, donc il n'y aura plus d'encart de contenu.

Suivi du champ UITextField actif

Avec ces méthodes, nous suivons le champ de texte actif:

 - (void) textFieldDidBeginEditing: (UITextField *) textField self.activeTextField = textField;  - (void) textFieldDidEndEditing: (UITextField *) textField self.activeTextField = nil; 

Quand on commence avec l'édition du activeTextField: variable est définie sur le champ actif. Quand on termine l'édition, le activeTextField:la variable est définie sur nil. Notez que nous avons déclaré le activeTextField propriété avec (non atomique, assigner), de sorte que le nombre de conservations n'est jamais incrémenté pour le champ de texte actif par notre affectation.

Rejeter le clavier

Ajoutez ce code pour ignorer le clavier:

 - (IBAction) licencierClavier: (id) expéditeur [activeTextField resignFirstResponder]; 

Cette action avait didEndOnExit comme type d'événement, donc si vous appuyez sur la touche revenir touche, le clavier sera ignoré. Vous devez connecter cette action à chaque champ de texte. Connectez également le délégué de chaque champ de texte à Propriétaire du fichier.

Emballer

Merci d'avoir lu cette astuce rapide sur le déplacement de contenu sous le clavier! Si vous avez des questions ou des commentaires sur ce tutoriel, laissez-les dans la section commentaires ci-dessous.!