Déplacer un point de vue uniquement lorsque le clavier couvre un champ de saisie
Je suis en train de construire un écran de saisie pour l'iPhone. L'écran a un certain nombre de champs de saisie. La plupart d'entre eux sur le haut de l'écran, mais les deux champs sont en bas.
Lorsque l'utilisateur tente de modifier le texte sur le bas de l'écran, le clavier s'affichera et il permettra de couvrir 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 toujours se déplace vers le haut et les champs en haut de l'écran se déplacer hors de la portée lorsque l'utilisateur tente de modifier ceux-ci.
Est-il un moyen d'avoir l'écran seulement déplacer lorsque le fond des champs sont modifiés?
J'ai utilisé ce code, je l'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
}
- peut-être vous pouvez utiliser la touche func textFieldDidBeginEditing(textField: UITextField!) { } pour détecter les textfield a commencé à le modifier et de faire le clavier afficher/ masquer
- J'ai oublié de mentionner que je suis nouveau sur Swift 🙁 Quelle serait la syntaxe correcte pour le vérifier? (comment puis-je obtenir le nom du champ dans cette fonction?)
Vous devez vous connecter pour publier un commentaire.
Votre problème est bien expliqué dans le présent document par Apple. Exemple de code sur cette page (à
Listing 4-1
) fait exactement ce dont vous avez besoin, il va se défiler de vue uniquement lorsque le courant de l'édition devrait être sous le clavier. Il vous suffit de mettre votre besoin de contrôles dans un scrollViiew.Le seul problème, c'est que c'est l'Objective-C et je pense que vous en avez besoin dans Swift..si..c'est ici:
Déclarer une variable
puis ajouter ces méthodes
Assurez-vous de déclarer votre ViewController comme
UITextFieldDelegate
et corriger les délégués dans vos méthodes d'initialisation:ex:
Et n'oubliez pas d'appeler
registerForKeyboardNotifications
sur viewInit etderegisterFromKeyboardNotifications
à la sortie.Modifier/Mise À Jour: Swift 4.2 Syntaxe
private func findActiveTextField (subviews : [UIView], inout textField : UITextField?) { for view in subviews { if let tf = view as? UITextField where view.isFirstResponder() { textField = tf break } else if !view.subviews.isEmpty { findActiveTextField (view.subviews, textField: &textField) } } }
let height = (keyboardSize?.height)! + 50
et ensuite utiliséheight
le cas échéant. Malheureusement, maintenant qu'il fait défiler la vue lorsque le premier champ est caché, quand firstResponder est transféré à partir de que champ de la suivant champ (ci-dessous), le champ de données d'image vient du fait qu'elle est dans un défilé jusqu'à la position de l'échec les "est-caché' test, et puis, il fait défiler la vue du fond... obscurcir le champ.activeField.convert(activeField.frame.origin, to: self.view)
au lieu de référenceractiveField.frame.origin
directement lors de l'utilisation deaRect.contains()
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
est plus sûrValue of type 'ViewController' has no member scrollView
textFieldDid...
fonctions detxtFieldDid...
Et @Siddharth, vous avez juste à ajouter une prise de courant connecté à votre vue-contrôleur appelé le scrollView, mine de lit@IBOutlet var scrollView: UIScrollView!
... AUSSI, ce fut une lecture intéressante: natashatherobot.com/ios-autolayout-scrollviewscrollview
activeField
UIKeyboardFrameEndUserInfoKey
au lieu deUIKeyboardFrameBeginUserInfoKey
, parce que le dernier retour de la hauteur de 0. Et changer le hittest point de fond, pas d'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) } }
UIKeyboardFrameBeginUserInfoKey
avecUIKeyboardFrameEndUserInfoKey
. Première donne l'image de départ du clavier, qui vient de zéro parfois, tandis que la seconde donne l'image de fin du clavier.keyboardWillBeHidden
est en train d'être exécuté, mais laUIScrollView
ne pas revenir à sa position d'origine. Quelqu'un at-il le même problème?keyboardWasShown
méthode ne prend pas en feu (j'.e l'imprimer, le mettre il ne fonctionne pas), même si le clavier a été invoquée. cette résultats dans la vue n'est pas de changer vers le haut. avez-vous le savez peut-être ce qui pourrait être la cause?textField's didBeginEditing
méthode est appelée APRÈS lakeyboardWillShow
méthode a été appelée. En conséquence, leactiveField
variable est toujours nul, ce qui signifie pas de défilement automatique se produit. Ma solution a été de mettre laactiveField = textField
appel dans le champ de l'shouldBeginEditing
méthode. Cela résout l'ordre des appels de problème.Ici est 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 par le biais de CocoaPods, pour l'installer, il suffit d'ajouter la ligne suivante à votre Podfile: (#236)
Dans AppDelegate.swift, il suffit d'importer IQKeyboardManagerSwift cadre et permettre IQKeyboardManager.
Et c'est tout. Facile!
IQKeyboardManager.shared.enable = true
Celui que j'ai trouvé fonctionne parfaitement pour moi c'était ça:
Vous pouvez également modifier les valeurs de hauteur. Supprimer le "if" si vous voulez l'utiliser pour tous les champs de texte.
Vous pouvez même l'utiliser pour toutes les commandes qui nécessitent la saisie de l'utilisateur comme TextView.
J'ai eu un problème similaire et a trouvé un assez simple solution sans à l'aide d'un scrollView, et au lieu d'utiliser des instructions if dans le keyboardWillShow/Masquer les méthodes.
C'était une bonne solution pour moi car je n'avais que deux champs de texte.
Changements de point de vue l'ensemble jusqu': que lorsque certains champs de texte (bottomText) sont éditées
Changements de point de vue l'ensemble vers le bas: seulement lorsque la vue n'est pas à l'emplacement d'origine
Pourquoi ne pas l'appliquer dans un UITableViewController à la place? Le clavier ne sera pas masquer les champs de texte lors de sa montre.
Il suffit d'utiliser cette extension pour déplacer une UIView lorsque le clavier est présenté.
Puis dans votre viewdidload lier votre point de vue pour le clavier
Swift 4 (**mise à jour) avec extension**
inViewDidLoad
ajouter l'extension suivante
Je pense que cette clause est faux:
Tandis que le activeField l'origine peut-être bien au-dessus du clavier, le maxY peut pas...
Je voudrais créer un " max " de point pour le activeField et vérifier si c'est le clavier Rect.
- Je utiliser SwiftLint, qui avait quelques problèmes avec la mise en forme de la accepté de répondre. Plus précisément:
pas d'espace avant les deux points,
aucune force de la coulée,
préférez UIEdgeInset(en haut: etc... au lieu de UIEdgeInsetMake.
voici donc ces mises à jour pour Swift 3
Voici ma version après la lecture de la documentation fournie par Apple et les posts précédents. Une chose que j'ai remarqué, c'est que le textView a pas été traitée lorsqu'elles sont couvertes par le clavier. Malheureusement, la documentation d'Apple ne fonctionnera pas parce que, pour quelque raison que ce soit, le clavier est appelé APRÈS la textViewDidBeginEditing est appelé. J'ai manipulé appeler une centrale de méthode qui vérifie si le clavier est affiché ET si un textView ou textField est en cours de modification. De cette façon, le processus n'est déclenché que lorsque les DEUX conditions.
Un autre point avec textViews est que leur hauteur peut être telle que le clavier clips le bas de la textView et ne permettrait pas de régler si le point en Haut à Gauche de l'été en vue. Ainsi, le code que j'ai écrit en fait de l'écran-référencé en Bas à Gauche du point de textView ou textField et voit si elle tombe dans l'écran-référencé coordonnées de l'présentées clavier ce qui implique que le clavier couvre une partie.
Si vous utilisez une manette de navigation, la sous-classe définit également le défilement de l'affichage de réglage automatique pour les encarts de faux.
Il se promène à travers chaque textView et textField pour définir des délégués pour la manipulation
Il suffit de régler votre classe de base à la sous-classe créés ici pour les résultats.
Dans l'exemple ci-dessous, je ne fais que déplacer la vue vers le haut quand j'ai commencer le montage de la txtLastName ou txtville. J'ai créé la variable keyboardActive parce que la vue peut se déplacer de haut 2x si je clique dans txtLastName et après que txtville.
Prendre un coup d'oeil et voir si cela fonctionne pour vous.
Génial réponses sont déjà donné, mais c'est une façon différente de faire face à cette situation (à l'aide de Swift 3x):
Tout d'abord appeler la méthode suivante dans
viewWillAppear()
Maintenant prendre un
IBOutlet
deUIView
's haut contraintes de votreUIViewcontroller
comme ceci: (ici leUIView
est la sous-vue deUIScrollView
cela signifie que vous devriez avoir unUIScrollView
pour tous vossubViews
)Et d'une autre variable telle que la suivante et ajouter un délégué, c'est à dire
UITextFieldDelegate
:Après qu'ici c'est la partie magique il suffit de coller ce ci-dessous extrait de:
Maintenant le dernier extrait de:
Ne pas oublier de donner des délégués pour tous vos
UITextField
s dansUIStoryboard
Bonne chance!
Swift 3 syntaxe:
c'est une bonne méthode pour obtenir ce que vous voulez
vous pouvez ajouter des "si" les conditions pour certains objets textfield
mais ce type de travaux pour tous... j'Espère que ça peut être utile pour tout le monde
Tout d'abord déclarer une variable pour identifier votre actif UITextField.
Étape 1:-
Comme
var activeTextField: UITextField
?Étape 2:-
Après cela, ajoutez ces deux lignes dans le viewDidLoad.
Étape 3:-
Maintenant définir ces deux méthodes dans votre contrôleur de classe.
Faire une var de uitextfield
Dans votre viewdid charge
Savoir cliqué sur le champ de texte. probablement vous rencontrez des textfields sur la totalité de l'écran.
Vérifiez si le clavier est couvrant textfield ou pas.
Retour pour fermer le clavier
Mise à JOUR :
NSNotification.Nom.UIKeyboardWillShow & NSNotification.Nom.UIKeyboardWillHide sont renommés pour UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification respectivement.
"J'ai oublié de mentionner que je suis nouveau sur Swift 🙁 Quelle serait la syntaxe correcte pour le vérifier? (comment puis-je obtenir le nom du champ dans cette fonction?) "
Ok . Assurez-vous d'abord à la UITextFieldDelegate protocole
Puis de mettre en œuvre la fonction
Vous devriez noter que la bonne approche consiste à utiliser un scrollview et placer le point de vue qui doit être déplacé vers le haut/vers le bas à l'intérieur de défilement de la vue et de gérer les événements de clavier en conséquence
Ce code se déplace le champ de texte que vous éditez, de sorte que vous pouvez l'afficher dans la Swift 3 pour répondre à cette question, vous devez également apporter votre point de vue d'un UITextFieldDelegate:
Et puis dans le viewDidLoad:
Qui appelle (à l'extérieur viewDidLoad):
Swift 3
Accepté la réponse est presque parfait. Mais j'ai besoin d'utiliser
UIKeyboardFrameEndUserInfoKey
au lieu deUIKeyboardFrameBeginUserInfoKey,
parce que le dernier retour keyborad hauteur de 0. Et changer le hittest point de fond, pas d'origine.Swift 4 mis à Jour ma solution
avec contrainte d'animation sur le clavier afficher/masquer,
profitez de.
Swift 4
Vous Pouvez Facilement Déplacer Vers Le Haut Et Vers Le Bas
UITextField
Avec Le Clavier De L'AnimationSwift 4.2
Ma solution (à la verticale), le centre de la vue sur une
UITextField
si sa position est sous le clavier.Étape 1: Créer un nouveau swift fichier et copiez-collez
UIViewWithKeyboard
classe.Étape 2: Dans Interface Builder définir comme une Classe Personnalisée pour votre plus haut
UIView
.Réécrit pour swift 4.2
Dans Le ViewDidLoad..
Restant Fonctions
Pour Swift 4.2
Ce code vous permettra de contrôler le moment de l'axe Y de l'image pour un périphérique spécifique à la taille de l'écran.
PS: Ce code ne sera pas intelligemment déplacer le cadre en fonction de l'emplacement de TextField.
Créer une extension pour UIDevice
Ajouter NotificationObserver sur viewDidLoad
Sélecteur de
Le problème de ce genre dans ReactNative android et IOS est résolu en suivant les étapes ci-dessous.
installer le paquet comme ça.
Maintenant importer clavier entretoise dans votre js ou jsx fichiers Réagir Natif projet comme celui-ci.
Alors le problème de clavier de masquer les champs de texte lors de l'écriture sera résolu.