J'essaie de créer un écran de saisie pour l'iPhone. L'écran comporte un certain nombre de champs de saisie. La plupart sont en haut de l'écran, mais deux champs sont en bas. Lorsque l'utilisateur essaie de modifier le texte en bas de l'écran, le clavier apparaît et il couvre l'écran. J'ai trouvé une solution simple pour déplacer l'écran vers le haut lorsque cela se produit, mais le résultat est que l'écran se déplace toujours vers le haut et que les champs en haut de l'écran se déplacent hors de portée lorsque l'utilisateur tente de les modifier.
Existe-t-il un moyen de faire bouger l'écran uniquement lorsque les champs du bas sont modifiés?
J'ai utilisé ce code que j'ai trouvé ici :
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Réponses:
Votre problème est bien expliqué dans ce document par Apple . Un exemple de code sur cette page (at
Listing 4-1
) fait exactement ce dont vous avez besoin, il fera défiler votre vue uniquement lorsque l'édition en cours devrait être sous le clavier. Il vous suffit de placer vos contrôles nécessaires dans un scrollViiew. Le seul problème est que c'est Objective-C et je pense que vous en avez besoin dans Swift ... alors ... c'est ici:Déclarer une variable
puis ajoutez ces méthodes
Assurez-vous de déclarer votre ViewController comme
UITextFieldDelegate
et de définir les délégués corrects dans vos méthodes d'initialisation: ex:Et n'oubliez pas d'appeler
registerForKeyboardNotifications
sur viewInit etderegisterFromKeyboardNotifications
à la sortie.Edition / mise à jour: syntaxe Swift 4.2
la source
UIKeyboardFrameEndUserInfoKey
place deUIKeyboardFrameBeginUserInfoKey
, car ce dernier retourne la hauteur 0. Et changez le point le plus frappé en bas et non à l'origine.if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
textField's didBeginEditing
méthode est appelée APRÈS que lakeyboardWillShow
méthode ait été appelée. En conséquence, laactiveField
variable est toujours nulle, ce qui signifie qu'aucun défilement automatique ne se produit. Ma solution a été de mettre l'activeField = textField
appel dans lashouldBeginEditing
méthode de textField . Cela résout le problème d'ordre des appels.Voici mes 2 cents:
Avez-vous essayé: https://github.com/hackiftekhar/IQKeyboardManager
Extrêmement facile à installer Swift ou Objective-C.
Voici comment cela fonctionne:
IQKeyboardManager (Swift): - IQKeyboardManagerSwift est disponible via CocoaPods, pour l'installer, ajoutez simplement la ligne suivante à votre Podfile: (# 236)
Dans AppDelegate.swift, importez simplement le framework IQKeyboardManagerSwift et activez IQKeyboardManager.
Et c'est tout. Facile!
la source
IQKeyboardManager.shared.enable = true
Celui que j'ai trouvé pour fonctionner parfaitement pour moi était le suivant:
Vous pouvez également modifier les valeurs de hauteur. Supprimez l'instruction "if" si vous souhaitez l'utiliser pour tous les champs de texte.
Vous pouvez même l'utiliser pour tous les contrôles qui nécessitent une entrée utilisateur comme TextView.
la source
J'ai eu un problème similaire et j'ai trouvé une solution assez simple sans utiliser de scrollView, et à la place en utilisant des instructions if dans les méthodes keyboardWillShow / Hide.
C'était une bonne solution pour moi car je n'avais que deux champs de texte.
Décale toute la vue vers le haut: uniquement lorsque certains champs de texte (bottomText) sont modifiés
Décale toute la vue vers le bas: uniquement lorsque la vue n'est pas à l'emplacement d'origine
la source
Utilisez simplement cette extension pour déplacer n'importe quel UIView lorsque le clavier est présenté.
Ensuite, dans votre viewdidload liez votre vue au clavier
la source
Pourquoi ne pas implémenter cela dans un UITableViewController à la place? Le clavier ne masquera aucun champ de texte lorsqu'il est affiché.
la source
Swift 4 (** mis à jour ) avec extension **
inViewDidLoad
ajouter l'extension suivante
la source
J'utilise SwiftLint, qui a eu quelques problèmes avec le formatage de la réponse acceptée. Plus précisément:
pas d'espace avant les deux-points, pas de cast de force, préférez UIEdgeInset (top: etc ... au lieu de UIEdgeInsetMake.
alors voici ces mises à jour pour Swift 3
la source
Je pense que cet article est faux:
Alors que l'origine de activeField peut bien être au-dessus du clavier, le maxY peut ne pas ...
Je créerais un point «max» pour le activeField et vérifierais si c'est dans le clavier Rect.
la source
Voici ma version après avoir lu la documentation fournie par Apple et les articles précédents. Une chose que j'ai remarquée est que le textView n'était pas géré lorsqu'il était couvert par le clavier. Malheureusement, la documentation d'Apple ne fonctionnera pas car, pour une raison quelconque, le clavier est appelé APRÈS l'appel de textViewDidBeginEditing. J'ai géré cela en appelant une méthode centrale qui vérifie si le clavier est affiché ET si un textView ou textField est en cours d'édition. De cette façon, le processus n'est déclenché que lorsque les DEUX conditions existent.
Un autre point avec textViews est que leur hauteur peut être telle que le clavier coupe le bas du textView et ne s'ajusterait pas si le point Haut-gauche de était en vue. Ainsi, le code que j'ai écrit prend en fait le point en bas à gauche référencé à l'écran de tout textView ou textField et voit s'il se situe dans les coordonnées référencées à l'écran du clavier présenté, ce qui implique que le clavier en couvre une partie.
Si vous utilisez un contrôleur de navigation, la sous-classe définit également l'ajustement automatique de la vue de défilement pour les inserts sur false.
Il parcourt chaque textView et textField pour définir les délégués à gérer
Définissez simplement votre classe de base sur la sous-classe créée ici pour les résultats.
la source
Des réponses impressionnantes sont déjà données mais c'est une manière différente de gérer cette situation (en utilisant Swift 3x ):
Tout d'abord, appelez la méthode suivante dans
viewWillAppear()
Maintenant, prenez l'une
IBOutlet
desUIView
principales contraintes de votreUIViewcontroller
comme ceci: (voici la sousUIView
-vue deUIScrollView
cela signifie que vous devriez avoir unUIScrollView
pour tous vossubViews
)Et une autre variable comme suit et ajoutez un délégué ie
UITextFieldDelegate
:Après cela, voici la partie magique, collez simplement cet extrait ci-dessous :
Maintenant, le dernier extrait:
N'oubliez pas d'assigner des délégués à tous vos
UITextField
s inUIStoryboard
Bonne chance!
la source
Syntaxe de Swift 3:
c'est une bonne méthode pour obtenir ce que vous voulez, vous pouvez ajouter des conditions "si" pour certains champs de texte mais ce type fonctionne pour tous ... J'espère que cela peut être utile pour tout le monde
la source
Tout d'abord, déclarez une variable pour identifier votre UITextField actif.
Étape 1:-
Comme comme
var activeTextField: UITextField
?Étape 2: - Après cela, ajoutez ces deux lignes dans viewDidLoad.
Étape 3:-
Définissez maintenant ces deux méthodes dans votre classe de contrôleur.
la source
Faire une var de uitextfield
Dans votre charge viewdid
Connaissez le champ de texte cliqué. vous avez probablement des champs de texte sur tout l'écran.
Vérifiez si le clavier couvre le champ de texte ou non.
Revenir pour fermer le clavier
MISE À JOUR: NSNotification.Name.UIKeyboardWillShow et NSNotification.Name.UIKeyboardWillHide sont renommés respectivement UIResponder.keyboardWillShowNotification et UIResponder.keyboardWillHideNotification.
la source
Swift : Vous pouvez le faire en vérifiant quel textField est présenté.
la source
Ce code se déplace vers le haut du champ de texte que vous modifiez afin que vous puissiez l'afficher dans Swift 3 pour cette réponse, vous devez également faire de votre vue un UITextFieldDelegate:
Et puis dans viewDidLoad:
Quels appels (hors viewDidLoad):
la source
Swift 3
la source
La réponse acceptée est presque parfaite. Mais je dois utiliser
UIKeyboardFrameEndUserInfoKey
au lieu deUIKeyboardFrameBeginUserInfoKey,
parce que ce dernier retourne la hauteur du keyborad 0. Et change le point le plus frappé vers le bas et non l'origine.la source
Swift 4 a mis à jour ma solution
avec animation de contrainte sur le clavier afficher / masquer, profitez-en.
la source
Swift 4
Vous pouvez facilement monter et descendre
UITextField
avec le clavier avec animationla source
Swift 4.2
Ma solution centrera (verticalement) la vue sur a
UITextField
si sa position est sous le clavier.Étape 1: Créez un nouveau fichier Swift et une
UIViewWithKeyboard
classe copier-coller .Étape 2: Dans Interface Builder, définissez-le comme une classe personnalisée pour vos meilleurs
UIView
.la source
Réécrit pour swift 4.2
Dans ViewDidLoad ..
Fonctions restantes
la source
"J'ai oublié de mentionner que je suis nouveau sur Swift :( Quelle serait la syntaxe correcte pour vérifier cela? (Comment obtenir le nom de champ dans cette fonction?)"
D'accord . Confirmez d'abord au protocole UITextFieldDelegate
Puis implémentez la fonction
Vous devez noter que la bonne approche consiste à utiliser une vue de défilement et à placer la vue qui doit être déplacée vers le haut / bas dans la vue de défilement et à gérer les événements de clavier en conséquence
la source
Pour Swift 4.2
Ce code vous permettra de contrôler le moment de l'axe Y du cadre pour une taille d'écran de périphérique spécifique.
PS: Ce code ne déplacera pas intelligemment le cadre en fonction de l'emplacement de TextField.
Créer une extension pour UIDevice
Ajouter NotificationObserver sur viewDidLoad
Sélecteur
la source