Move View with Keyboard Using Swift : Optimisation et performance
\n\nChaque développeur iOS a déjà été confronté à la situation où le clavier recouvre impoliment un UITextField ou un UITextView. L'utilisateur tape dans le champ, le clavier apparaît, mais l'interface reste impassible. Résultat : irritation, erreurs de saisie et suppression de l'application. Résoudre ce problème en Swift n'est pas simplement un « move view with keyboard », c'est toute une science de la performance et de l'expérience utilisateur.
Dans cet article, nous allons voir comment implémenter correctement move view with keyboard using Swift, optimiser les animations et éviter les erreurs typiques. Vous obtiendrez un code prêt à l'emploi que vous pourrez insérer directement dans votre projet et comprendrez pourquoi certaines approches ralentissent l'interface utilisateur alors que d'autres fonctionnent parfaitement.
\n\nPourquoi les solutions standard fonctionnent-elles souvent mal ?
\n\nSur Stack Overflow, la question « Move view with keyboard using Swift » a recueilli des milliers de vues. Et ce n'est pas un hasard. De nombreux débutants copient la première solution venue de 2015, qui utilise UIKeyboardWillShowNotification et modifie brutalement le frame d'un UIView. Résultat : animation saccadée, fuites mémoire et bugs sur différents modèles d'iPhone.
Les principaux problèmes des anciennes approches :
\n- \n
- Modification directe du
framesans tenir compte de lasafe area; \n - Ignorance de la durée et des courbes d'animation du clavier ; \n
- Absence de gestion de la rotation de l'écran et du multitâche ;
- Oubli : les notifications ne sont pas supprimées, les objets ne sont pas nettoyés.
Le Swift moderne (5.0+) et UIKit permettent de faire tout cela de manière élégante et rapide. Analysons le modèle optimal.
\n\nPréparation : de quoi avons-nous besoin
\n\nPour implémenter move view with keyboard using Swift, nous allons utiliser :
\n- \n
NotificationCenterpour suivre les événements du clavier ;UIView.animateavec les paramètres de la notification ;UIScrollViewcomme conteneur de base (mais on peut s'en passer) ;- Une bonne gestion de la mémoire (weak self, removeObserver).
Nous écrirons tout le code dans un UIViewController. Si vous utilisez SwiftUI, les principes sont les mêmes, mais l'API est différente (nous en parlerons à la fin de l'article).
Étape 1 : Enregistrer les notifications du clavier
\n\nLa première chose à faire est de s'abonner à deux notifications clés : UIResponder.keyboardWillShowNotification et UIResponder.keyboardWillHideNotification. Ce sont elles qui nous donnent la taille, la durée et la courbe d'animation.
override func viewDidLoad() {\n super.viewDidLoad()\n \n NotificationCenter.default.addObserver(\n self,\n selector: #selector(keyboardWillShow),\n name: UIResponder.keyboardWillShowNotification,\n object: nil\n )\n \n NotificationCenter.default.addObserver(\n self,\n selector: #selector(keyboardWillHide),\n name: UIResponder.keyboardWillHideNotification,\n object: nil\n )\n}\n\n\nRemarque : object: nil signifie que nous écoutons les notifications de n'importe quel clavier. C'est correct dans la plupart des cas.
Étape 2 : Le gestionnaire keyboardWillShow
\n\nDans cette méthode, nous extrayons de la notification la taille du clavier et la durée de l'animation. Ensuite, nous déplaçons la vue vers le haut de la hauteur du clavier.
\n\n@objc private func keyboardWillShow(_ notification: Notification) {\n guard let userInfo = notification.userInfo,\n let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,\n let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,\n let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {\n return\n }\n \n let keyboardHeight = keyboardFrame.height\n let animation