J'ai une application où, dans Interface Builder , j'ai configuré une UIView
qui a un champ de texte près du bas de la vue. Lorsque j'exécute l'application et que j'essaie de saisir du texte dans ce champ, le clavier glisse au-dessus du champ afin que je ne puisse pas voir ce que je saisis jusqu'à ce que je masque à nouveau le clavier.
Quelqu'un d'autre a-t-il rencontré ce problème et trouvé un bon moyen de le résoudre sans faire défiler la vue parent ou déplacer le champ de texte plus haut sur l'écran?
ios
iphone
keyboard
uitextfield
Cruinh
la source
la source
Réponses:
La solution habituelle consiste à faire glisser le champ (et tout ce qui se trouve au-dessus) vers le haut avec une animation, puis à reculer lorsque vous avez terminé. Vous devrez peut-être placer le champ de texte et certains des autres éléments dans une autre vue et faire glisser la vue comme une unité. (J'appelle ces choses "plaques" comme dans "plaques tectoniques", mais ce n'est que moi). Mais voici l'idée générale si vous n'avez pas besoin d'être sophistiqué.
la source
Cela a fonctionné à merveille pour moi en glissant des uitextfields
En particulier, il a l'avantage de calculer la distance d'animation de la diapositive en fonction de la position du champ de texte.
la source
IQKeyboardManager le fait pour vous sans LIGNE DE CODE , il suffit de faire glisser et déposer le fichier source associé au projet. IQKeyboardManager prend également en charge l' orientation des périphériques , la gestion automatique de la barre d'outils UIT , keyboardDistanceFromTextField et bien plus que vous ne le pensez.
Voici l'organigramme de contrôle:
Etape 1: - les notifications globales Ajout de
UITextField
,UITextView
etUIKeyboard
dans une classe singleton. Je l'ai appelé IQKeyboardManager .Étape 2: - Si trouvé
UIKeyboardWillShowNotification
,UITextFieldTextDidBeginEditingNotification
ou desUITextViewTextDidBeginEditingNotification
notifications, essayez d'obtenir unetopMostViewController
instance de laUIWindow.rootViewController
hiérarchie. Afin de bien découvrirUITextField
/UITextView
sur celui-ci,topMostViewController.view
le cadre de s doit être ajusté.Étape 3: - Distance de déplacement prévue calculée
topMostViewController.view
par rapport à la première réponseUITextField
/UITextView
.Étape 4: - Déplacé
topMostViewController.view.frame
vers le haut / vers le bas en fonction de la distance de déplacement attendue.Étape 5: - Si trouvé
UIKeyboardWillHideNotification
,UITextFieldTextDidEndEditingNotification
ouUITextViewTextDidEndEditingNotification
notification, essayez à nouveau d'obtenir unetopMostViewController
instance de laUIWindow.rootViewController
hiérarchie.Étape 6: - Distance perturbée calculée
topMostViewController.view
dont il faut restaurer sa position d'origine.Étape 7: - Rétabli
topMostViewController.view.frame
en fonction de la distance perturbée.Étape 8: - Instance de classe IQKeyboardManager singleton instanciée lors du chargement de l'application, de sorte que chaque
UITextField
/UITextView
dans l'application s'ajuste automatiquement en fonction de la distance de déplacement attendue.C'est tout
la source
Pour développer la réponse d'Amagrammer, voici un exemple de classe:
LoginViewController.h
Notez que nous implémentons le "UITextFieldDelegate"
LoginViewController.m
la source
UIApplicationDidEnterBackgroundNotification
, sinon il se déplacera plus vers le bas si vous appuyez sur le bouton Accueil et revenez dans l'application, la rendant moche et boguée.Que diriez-vous de la solution officielle: déplacer le contenu situé sous le clavier
la source
J'ai rencontré le même problème dans les
UITableView
cellules textField. Je résous ce problème en implémentant la méthode suivante pour écouter la notification du clavier.Observateur pour les notifications ici:
Gérez ces notifications en utilisant la fonction ci-dessous:
la source
Regarde ça. Pas de soucis pour vous.
Cette solution est très soignée. Tout ce que vous avez à faire est d'ajouter vos champs de texte dans un
UIScrollView
et de changer sa classe enTPKeyboardAvoidingScollView
, si vous utilisez des storyboards. La vue de défilement est étendue de manière à détecter le moment où le clavier est visible et à se déplacer au-dessus du clavier à une distance raisonnable. C'est la solution parfaite car elle est indépendante de la vôtreUIViewController
. Chaque chose nécessaire est faite dans la classe mentionnée ci-dessus. Merci Michael Tyson et tous.TPKeyboardÉvitement
la source
Voici une version rapide de la réponse d'Amagrammer. Aussi, une variation utilisant l'événement UIKeyboardWillShowNotification car j'avais besoin de connaître la taille des claviers avant de déplacer la vue.
la source
Il y a eu une grande procédure pas à pas pour éditer les champs de texte sans obscurcir (lien mort maintenant, voici un lien Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / edit-textfields-without-obscuring.html ). Il montre comment déplacer un existant
UIView
sur unUIScrollView
, et le faire défiler automatiquement lorsque le clavier apparaît.Je l'ai mis à jour un peu pour calculer la hauteur correcte pour le
UIScrollView
quand il y a des contrôles (tels que aUITabBar
) sous leUIScrollBar
. Voir l' article mettant à jour uiview .la source
Voici une solution utilisant Xcode5, iOS7:
Utilisez les blocs UITextfieldDelegate et animation.
C'est presque tout le code du ViewController, mais je voulais inclure le code du délégué pour ceux qui ne connaissent pas encore le modèle de délégué (comme moi). J'ai également inclus un code pour masquer le clavier lorsque vous appuyez loin de la vue de texte.
Vous pouvez déplacer les vues (boutons, champs de texte, etc.) aussi haut que vous le souhaitez, assurez-vous simplement de les remettre en place (+100 puis plus tard -100).
la source
Je suppose qu'une façon serait de déplacer toute la position de votre vue de (x, y) à (x, y-keybaardHeight) lorsque le champ de texte est cliqué et de le remettre lorsque le clavier est ignoré, cela peut sembler un peu étrange car la vue est juste apparaît (peut-être que ce ne serait pas mal si vous l'animiez).
la source
En plus de la solution d'Amagrammer, si vous utilisez cocos2d en mode portrait, changez cette ligne:
pour ça:
Si vous utilisez cocos2d en mode paysage, effectuez la modification ci-dessus et changez les
up
valeurs entretextFieldDidBeginEditing:
ettextFieldDidEndEditing:
la source
J'ai eu le même problème et j'ai trouvé que GTKeyboardHelper était une solution facile.
Après avoir fait glisser et déposer le framework dans votre projet, incluez le fichier d'en-tête. Téléchargez et ouvrez l'exemple de projet, puis faites glisser l'objet "Keyboard Helper" de la section des objets dans le xib vers la section des objets dans le générateur d'interface de votre projet.
Faites glisser et déposez toutes vos vues pour être des enfants de "Keyboard Helper".
la source
Glisser-déposer le framework que j'utilise dans mes projets. Prend en charge le rejet automatique lorsque vous appuyez en dehors d'un premier répondeur ou lorsque vous faites défiler.
GTKeyboardHelper
la source
Faites simplement glisser la vue de haut en bas au besoin:
N'oubliez pas de définir
self
commeUITextFieldDelegate
et comme textField réeldelegate
.(Merci à Ammagrammer, ce n'est qu'une réponse plus courte utilisant des blocs pour les animations)
la source
J'ai autre chose si tu veux. Le point ici est que vous souhaitez définir le centre de votre UIView sur le champ de texte que vous modifiez.
Avant cela, vous devez enregistrer votre INITIAL_CENTER , en tant que CGPoint , de self.view.center et votre INITIAL_VIEW en tant que CGRect de self.view.frame dans une propriété const.
Vous pouvez créer une méthode comme celle-ci:
Ensuite, sur votre UITextFieldDelegate , vous devez appeler centerOn: (CGRect) dans les méthodes suivantes:
textFieldDidBeginEditing: (UITextField *) avec, comme paramètre, le cadre du champ de texte sur lequel vous souhaitez centrer.
Et vous devez l'appeler dans votre gestionnaire d'événements, où vous fermez votre clavier,
textFieldDidEndEditing: (UITextField *) peut être l'une des façons de le faire, en mettant INITIAL_VIEW comme paramètre de centerOn: (CGRect) .
la source
Je crois que sur les versions plus récentes d'iOS (6.1+, peut-être même plus tôt), la vue sous-jacente, au moins pour UITableView, se rétrécit automatiquement lorsque le clavier apparaît. Il vous suffit donc de rendre le champ de texte visible dans cette vue. Dans
init
:puis:
la source
https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example J'espère que cette solution a aidé. Ils sont tous écrits par Swift 3.
la source