J'ai une application qui a un champ de texte dans la moitié inférieure de la vue. Cela signifie que lorsque je vais taper dans le champ de texte, le clavier couvre le champ de texte.
Comment pourrais-je déplacer la vue vers le haut lors de la frappe pour pouvoir voir ce que je tape, puis la replacer à sa place d'origine lorsque le clavier disparaît?
J'ai cherché partout mais toutes les solutions semblent être en Obj-C que je ne peux pas encore convertir.
Toute aide serait grandement appréciée.
ios
swift
uikit
nsnotificationcenter
uikeyboard
Alex Catchpole
la source
la source
it is actually needed to scroll view up when keyboard appears
Réponses:
Voici une solution, sans gérer le passage d'un textField à un autre:
Pour résoudre ce problème, remplacez les deux fonctions
keyboardWillShow/Hide
par celles-ci:MODIFIER POUR SWIFT 3.0:
MODIFIER POUR SWIFT 4.0:
MODIFIER POUR SWIFT 4.2:
la source
UIKeyboardFrameEndUserInfoKey
plutôt queUIKeyboardFrameBeginUserInfoKey
pour obtenir la taille du clavier. Je ne sais pas pourquoi pour le moment, mais le premier donnera des résultats plus cohérents.UIKeyboardFrameBeginUserInfoKey
parUIKeyboardFrameEndUserInfoKey
. La première donne l'image de début du clavier, qui arrive parfois à zéro, tandis que la seconde donne l'image de fin du clavier.Le moyen le plus simple qui ne nécessite même pas de code:
L'objet se déplacera automatiquement vers le haut avec le clavier, en synchronisation.
la source
DispatchQueue.main.async {}
pour le corriger. Bon travail! Pouces vers le haut!L'une des réponses populaires sur ce sujet utilise le code suivant:
Il y a un problème évident avec la compensation statique de votre vue. Il aura fière allure sur un appareil, mais sera mauvais sur toute autre configuration de taille. Vous devrez obtenir la hauteur des claviers et l'utiliser comme valeur de décalage.
Voici une solution qui fonctionne sur tous les appareils et gère le cas de bord où l'utilisateur masque le champ de texte prédictif lors de la frappe.
Solution
Important à noter ci-dessous, nous passons self.view.window comme paramètre d'objet. Cela nous fournira des données de notre clavier, telles que sa hauteur!
Nous allons le rendre agréable sur tous les appareils et gérer le cas où l'utilisateur ajoute ou supprime le champ de texte prédictif.
Supprimer des observateurs
N'oubliez pas de retirer vos observateurs avant de quitter la vue pour éviter la transmission de messages inutiles.
Mise à jour basée sur la question des commentaires:
Si vous avez deux ou plusieurs champs de texte, vous pouvez vérifier si votre view.frame.origin.y est à zéro.
la source
Ajoutez ceci à votre viewcontroller. Fonctionne comme un charme. Ajustez simplement les valeurs.
la source
J'ai un peu amélioré l'une des réponses pour la faire fonctionner avec différents claviers et différents affichages de texte / champs sur une seule page:
Ajouter des observateurs:
Supprimer des observateurs:
la source
Pas une publicité ou une promotion ou un spam , juste une bonne solution. Je sais que cette question a près de 30 réponses et je suis tellement choqué que personne n'a même mentionné une seule fois ce beau projet GitHub qui fait tout pour vous et encore mieux. Toutes les réponses déplacent simplement la vue vers le haut. Je viens de résoudre tous mes problèmes avec ce IQKeyboardManager. Il a plus de 13000 étoiles.
Ajoutez simplement ceci dans votre podfile si vous utilisez swift
puis à l'intérieur de votre AppDelegate.swift faire
import IQKeyboardManagerSwift
Ajouter la ligne
IQKeyboardManager.shared.enable = true
pour l'activerCette solution est indispensable si vous allez en production.
la source
import IQKeyboardManager
et utiliséIQKeyboardManager.shared().isEnabled = true
dans AppDelegatePour les erreurs d'écran noir (Swift 4 et 4.2) .
J'ai corrigé le problème d'écran noir. Dans la solution vérifiée La hauteur du clavier change après avoir tapé et cela provoque un écran noir.
Vous devez utiliser UIKeyboardFrameEndUserInfoKey au lieu de UIKeyboardFrameBeginUserInfoKey
la source
Je vois que toutes les réponses déplacent la vue elle-même de la valeur de la hauteur du clavier. Eh bien, j'ai une réponse élaborée, qui pourrait être utile si vous utilisez des contraintes, par exemple
autolayout
- qui déplace une vue en modifiant sa valeur de contrainte (contraintes inférieure ou supérieure par exemple) par une valeur prédéfinie ou vous pouvez utiliser une valeur de taille de clavier.Dans cet exemple, j'utilise la contrainte inférieure du champ de texte à la vue de présentation inférieure avec une valeur initiale de 175.
la source
Il y a eu quelques changements dans la façon dont nous définissons la KeyboardWillHideNotification.
Cette solution fonctionne avec Swift 4.2 :
la source
Après 4-5 heures de combat, je suis venu avec une simple extension de UIViewController avec un code simple qui fonctionne comme un charme
* La vue ne doit pas bouger lorsque TextField est au-dessus du clavier
* Pas besoin de définir une valeur constante sur NSLayoutConstraint
* Aucune bibliothèque tierce partie requise
* Aucun code d'animation requis
* Fonctionne également sur tableview
* Cela fonctionne sur la mise en page automatique / redimensionnement automatique
Ajoutez cette extension de UIResponder pour obtenir quel TextField est sélectionné
Ensuite, utilisez-le dans votre n'importe quel ViewController
Enregistrez cette notification dans
func viewWillAppear(_ animated: Bool)
Désenregistrer cette notification dans
func viewWillDisappear(_ animated:Bool)
Téléchargez la démo ici
la source
Pour Swift 3, j'ai créé une sous-classe UIViewController car j'avais besoin d'un comportement constant dans tous les contrôleurs de vue.
la source
La réponse validée ne prend pas en compte la position du champ de texte et a un bug (double déplacement, ne jamais revenir à la position principale, déplacement même si le texfield est au dessus de la vue ...)
L'idée est:
alors nous ne pourrons déplacer la vue que si nécessaire et du déplacement spécifique afin d'avoir le texField focalisé juste au dessus du clavier
Voici le code:
Swift 4
}
la source
J'ai remarqué que les autres réponses impliquaient de couper une partie du haut de la vue. Si vous souhaitez simplement redimensionner la vue sans couper de contenu, essayez simplement cette méthode :)
la source
Mes deux cents pour les débutants: dans les exemples ci-dessus, quelqu'un change les coordonnées, d'autres utilisent le "masque de redimensionnement automatique" et d'autres contraintes:
Comme le dit Apple, ne mélangez pas ces 3 types de logique. Si vous avez des contraintes dans Storyboard, n'essayez pas de changer x / y. Cela ne fonctionne définitivement pas.
la source
Donc, aucune des autres réponses ne semble bien faire les choses.
Le bon clavier sur iOS devrait:
Mon code utilise un
NSLayoutConstraint
déclaré comme@IBOutlet
Vous pouvez également utiliser des transformations, afficher des décalages, .... Je pense que c'est plus facile avec la contrainte tho. Il fonctionne en définissant une contrainte en bas, vous devrez peut-être modifier le code si votre constante n'est pas 0 / Pas en bas.
Voici le code:
la source
sa réponse parfaite à 100% pour toutes les mises à jour de Guy Tableview Height lorsque le clavier est ouvert
Pour Swift4.2
Swift3.2
la source
Pour Swift 3
la source
Swift 4:
J'avais un problème avec la réponse la plus acceptée, dans laquelle masquer le clavier ne renvoyait pas la vue jusqu'en bas de la page (seulement partiellement). Cela a fonctionné pour moi (+ mis à jour pour Swift 4).
la source
Semblable à la réponse @Boris, mais dans Swift 5 :
la source
Voici ma solution (en fait, ce code est pour le cas où vous avez peu de champs de texte dans votre vue, cela fonctionne également pour le cas où vous avez un champ de texte)
la source
Mis à jour pour Swift 3 ...
Comme d'autres l'ont dit, vous devez ajouter des observateurs de notification dans la méthode viewDidLoad () de votre contrôleur, comme ceci:
N'oubliez pas de supprimer vos observateurs le cas échéant (je le fais dans la méthode viewWillDisappear ())
Ensuite, implémentez vos méthodes show et hide - notez la ligne qui indique à l'application d'ignorer les événements d'interaction (beginIgnoringInteractionEvents). Ceci est important car sans lui, l'utilisateur pourrait appuyer sur un champ ou même une vue de défilement et provoquer le décalage une deuxième fois, ce qui entraînerait un terrible problème d'interface utilisateur. Ignorer les événements d'interaction avant l'affichage et le masquage du clavier évitera ceci:
Enfin, réactivez les interactions utilisateur (rappelez-vous, cette méthode se déclenche après le clavier didShow ou didHide):
la source
Code Swift 3
la source
Si vous avez 2 champs de texte ou plus sur le même VC, et que l'utilisateur tape sur l'un d'eux puis sur l'autre, sans appeler la fonction keyboardWillHide, la vue monte une fois de plus, ce qui n'est pas nécessaire, car vous aurez le clavier, un espace vide qui a la hauteur du clavier, puis la vue, en utilisant le code dans la réponse que j'ai modifiée:
Pour résoudre ce problème, remplacez les deux fonctions "KeyboardWillShow / Hide" par celles-ci:
la source
@ La solution de Boris est TRÈS bonne mais la vue peut parfois être corrompue.
Pour un alignement parfait, utilisez le code ci-dessous
Les fonctions:
Et,
la source
ce tutoriel vidéo est le meilleur. 7 minutes et ça aura tellement de sens. Une telle solution simple lorsque vous avez plusieurs champs de texte et que vous souhaitez que la vue de défilement déplace la quantité "x" de pixels lorsque ce champ de texte spécifique est appuyé.
https://youtu.be/VuiPGJOEBH4
Juste ces étapes:
-Placez tous vos champs de texte dans une vue de défilement limitée aux bords de la vue.
-Connectez tous les champs de texte et faites défiler la vue en tant que délégués au contrôleur de vue.
-Connectez tous les champs de texte et faites défiler la vue avec un IBOutlet.
-Ajouter le protocole UITextFieldDelegate à votre classe
-Ajoutez les méthodes UITextFieldDelegate à votre fichier swift:
La première méthode active simplement le bouton de retour sur le clavier pour fermer le clavier. La seconde est lorsque vous appuyez sur n'importe quel champ de texte spécifique, puis définissez le décalage y de la distance de défilement de votre vue (la mienne est basée sur l'emplacement y sur mes contrôleurs de vue 25, 57, 112, 142). Le dernier dit que lorsque vous appuyez loin du clavier, la vue de défilement revient à son emplacement d'origine.
J'ai rendu ma vue pixel parfaite de cette façon!
la source
Cette fonctionnalité devrait être intégrée à Ios, mais nous devons la faire en externe.
Insérez le code ci-dessous
* Pour déplacer la vue lorsque textField est sous le clavier,
* Ne pas déplacer la vue lorsque textField est au-dessus du clavier
* Pour déplacer la vue en fonction de la hauteur du clavier si nécessaire.
Cela fonctionne et testé dans tous les cas.
| :: | Parfois, la vue sera vers le bas, dans ce cas, utilisez la hauteur +/- 150:
la source
il doit être plus stable
la source
la source
Utilisez le code suivant pour afficher Up sur UITextField Clicked
la source
J'ai fait un cocoapod pour simplifier la chose:
https://github.com/xtrinch/KeyboardLayoutHelper
Comment l'utiliser:
Faites une contrainte de fond de disposition automatique, donnez-lui une classe de KeyboardLayoutConstraint dans le module KeyboardLayoutHelper et le pod fera le travail nécessaire pour l'augmenter pour accueillir le clavier qui apparaît et disparaît. Voir l'exemple de projet sur les exemples d'utilisation (j'en ai créé deux: textFields à l'intérieur d'un scrollView et textFields centrés verticalement avec deux vues de base - connexion et enregistrement).
La contrainte de mise en page inférieure peut être de la vue conteneur, du champ textField lui-même, n'importe quoi, vous le nommez.
la source