Comment redimensionner UITextView lorsque le clavier est affiché avec iOS 7
J'ai vue contrôleur qui contient plein écran UITextView
. Lorsque le clavier est affiché, je voudrais redimensionner l'affichage de texte de sorte qu'il n'est pas caché sous le clavier.
C'est assez standard approche avec iOS, comme décrit dans cette question:
Comment redimensionner UITextView sur iOS lorsqu'un clavier s'affiche?
Cependant, avec iOS 7, si l'utilisateur appuie sur le texte à afficher dans la moitié inférieure de l'écran, lors de l'affichage du texte de la redimensionne, le curseur reste à l'écran. Le texte afficher uniquement les parchemins pour amener le curseur dans la vue si lorsque l'utilisateur appuie sur entrée.
source d'informationauteur ColinE
Vous devez vous connecter pour publier un commentaire.
J'ai lu les docs qui parler de ce sujet très. Je l'ai traduit en Swift et cela a fonctionné absolument magnifiquement pour moi.
Ce est utilisé pour une pleine page UITextView comme iMessage.
Je suis de l'utilisation d'iOS 8.2 et rapide sur XCode 6.2 et voici mon code. Appelez simplement ce
setupKeyboardNotifications
de votreviewDidLoad
ou une autre méthode d'initialisation.Aussi, si vous rencontrez des problèmes avec le curseur au bon endroit lors de la rotation vérifier le changement d'orientation et faites défiler jusqu'à la position droite.
Swift 3:
Avec Mise en page Automatique, il est beaucoup plus facile (à condition de comprendre la Mise en page Automatique) pour traiter:
Au lieu de tenter d'identifier et de redimensionner le touché de vues, il vous suffit de créer un cadre parent pour tous vos point de vue du contenu. Ensuite, si le kbd s'affiche, vous redimensionner le cadre, et si vous avez configuré les contraintes correctement, l'affichage va réorganiser l'ensemble de ses vues enfant bien. Pas besoin de jouer avec beaucoup de dur-à-lire le code pour cela.
En fait, dans un question similaire j'ai trouvé un lien vers cette excellent tutoriel sur cette technique.
Aussi, les autres exemples qui utilisent textViewDidBeginEditing au lieu de la UIKeyboardWillShowNotification ont un gros problème:
Si l'utilisateur a un externe bluetooth clavier attaché, puis le contrôle serait toujours obtenir poussé à la hausse même si aucun clavier à l'écran apparaît. Ce n'est pas bon.
Donc, pour résumer:
pas le TextEditField événements pour décider du moment de redimensionner votre
vue sur.
Sinon, découvrez LeoNatan réponse. C'est même peut-être un nettoyant et une solution plus simple (je n'ai pas essayé moi-même encore).
Ne pas redimensionner l'affichage de texte. Au lieu de cela, définir la
contentInset
etscrollIndicatorInsets
bas à la hauteur du clavier.Voir ma réponse ici:
https://stackoverflow.com/a/18585788/983912
Modifier
J'ai fait les modifications suivantes à votre exemple de projet:
Retiré réglage de l'ancienne position du curseur à la première, ainsi que les personnes handicapées de l'animation. Maintenant semble bien fonctionner.
Alors que la réponse donnée par @Divya me conduire à la solution correcte (j'ai donc reçu le bounty), il n'est pas vraiment de réponse claire! Ici, il est dans le détail:
L'approche standard à ce que l'affichage de texte n'est pas caché par le clavier à l'écran est de mettre à jour son cadre lorsque le clavier est affiché, comme détaillé dans cette question:
Comment redimensionner UITextView sur iOS lorsqu'un clavier s'affiche?
Cependant, avec iOS 7, si vous modifiez le texte à afficher au sein de votre gestionnaire pour l'
UIKeyboardWillShowNotification
notification, le curseur restera hors de l'écran, comme décrit dans cette question.Le correctif de ce problème est de changer le texte à afficher en réponse à la
textViewDidBeginEditing
méthode du délégué à la place:REMARQUE: malheureusement
textViewDidBeginEdting
les feux avant de laUIKeyboardWillShowNotification
de notification, d'où la nécessité de coder en dur la hauteur du clavier.Suivante est de travailler pour moi :
.h fichier
.m fichier
je l'avais fait et son travail complètement.
C'est ma solution, juillet 2015, l'utilisation de Swift 1.2 sur Xcode 6.4 ciblage iOS 7.1 - une combinaison de plusieurs approches. Emprunté Johnston clavier remise code Swift. C'est un peu d'un hack, mais c'est simple et ça fonctionne.
J'ai une vanille UITextView à l'intérieur d'une seule Vue.
Je n'ai pas envie de l'intégrer à l'intérieur d'un UIScrollView comme par La documentation d'Apple. Je voulais juste le UITextView redimensionnées lorsque le logiciel du clavier est apparu, et redimensionnée à l'original lors d'un clavier a été rejetée.
Ce sont les étapes de base:
Donc, sur le code.
J'ai mis en place de contrainte prise en haut du fichier de code via l'habitude de glisser-déposer dans l'interface builder:
@IBOutlet weak var myUITextViewBottomConstraint: NSLayoutConstraint!
J'ai également mis en place une variable globale où je peux sauvegarder l'état des lieux avant le clavier:
var myUITextViewBottomConstraintBackup: CGFloat = 0
Mettre en œuvre pour clavier de notifications, l'appel à cette fonction dans le viewDidLoad ou tout autre de démarrage de l'installation/de l'article:
Puis ces deux fonctions est appelée automatiquement lorsque le clavier est affiché/rejetée:
Le code fonctionne, avec un problème mineur:
@Johnston a trouvé une bonne solution. Voici une variation à l'aide de
UIKeyboardWillChangeFrameNotification
qui correctement comptes pour clavier changements de taille (c'est à dire montrer/cacher le QuickType bar). Il a également gère correctement le cas où l'affichage de texte est intégré dans une manette de navigation (c'est à dire où lacontentInset
n'est pas contraire à zéro). Il est également écrit dans Swift 2.