UITextField: déplacer la vue lorsque le clavier apparaît
Je suis actuellement en train de travailler sur une application iPhone avec un seul point de vue, qui a de multiples UITextFields pour l'entrée. Lorsque le clavier montre, il se superpose à la partie inférieure textfields. J'ai donc ajouté le textFieldDidBeginEditing:
méthode, pour déplacer la vue vers le haut, qui fonctionne très bien:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
if ( ( textField != inputAmount ) && ( textField != inputAge ) ) {
NSTimeInterval animationDuration = 0.300000011920929;
CGRect frame = self.view.frame;
frame.origin.y -= kOFFSET_FOR_KEYBOARD;
frame.size.height += kOFFSET_FOR_KEYBOARD;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];
}
}
Cette méthode vérifie si la source du message est l'un des objets textfield qui sont visibles lorsque le clavier montre, et si non, il se déplace le point de vue.
J'ai aussi ajouté le textFieldDidEndEnditing:
méthode, qui permet de déplacer la vue vers le bas à nouveau (et mise à jour de certains objets de modèle en fonction de l'évolution de l'entrée):
- (void)textFieldDidEndEditing:(UITextField *)textField {
if ( ( textField != inputMenge ) && ( textField != inputAlter ) ) {
NSTimeInterval animationDuration = 0.300000011920929;
CGRect frame = self.view.frame;
frame.origin.y += kOFFSET_FOR_KEYBOARD;
frame.size.height -= kOFFSET_FOR_KEYBOARD;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];
}
//Additional Code
}
Cependant, cette solution présente des défauts simple: Quand j'ai fini d'éditer l'un des "caché" textfields et touchez un autre champ de texte, le clavier disparaît, la vue se déplace vers le bas, la vue se déplace de nouveau et le clavier s'affiche à nouveau.
Est-il possible de garder le clavier de disparaître et de réapparaître entre deux vérifications (de la "caché" textfields - pour que la vue ne se déplace que lorsque le textfield les changements d'un qui serait masquée par le clavier pour un qui n'aurait pas caché)?
Vous devez vous connecter pour publier un commentaire.
Cette solution est basée sur ComSubVie un.
Avantages:
UIKeyboardWillShowNotification
au lieu deUIKeyboardDidShowNotification
pour synchroniser le clavier de l'animation et des actions personnalisées;UIKeyboardBoundsUserInfoKey
;KBKeyboardHandler
;KBKeyboardHandler
classe peut être facilement étendu /modifié afin de mieux répondre à des besoins spécifiques;Limitations:
UIWindow
. Si vous utilisez plusieurs UIWindows, vous devrez peut-être modifierretrieveFrameFromNotification:
méthode.Utilisation:
Inclure KBKeyboardHandler.h, KBKeyboardHandler.m et KBKeyboardHandlerDelegate.h dans votre projet. Mettre en œuvre les
KBKeyboardHandlerDelegate
protocole dans votre vue-contrôleur - il se compose d'une méthode unique, qui sera appelée lorsque le clavier est affiché, masqué ou sa taille est modifiée. Instancier leKBKeyboardHandler
et l'ensemble de son délégué (généralement de soi). Voir l'exemple deMyViewController
ci-dessous.KBKeyboardHandler.h:
KBKeyboardHandler.m:
KBKeyboardHandlerDelegate.h:
Échantillon MyViewController.h:
Échantillon MyViewController.m:
Mise à JOUR: correction d'iOS 7 avertissement, merci @weienv.
Je viens de résoudre ce problème. La solution est une combinaison d'un
UIKeyboardDidShowNotification
etUIKeyboardDidHideNotification
observateur auprès de la ci-dessustextFieldDidBeginEditing:
ettextFieldDidEndEditing:
méthodes.Vous avez besoin de trois variables supplémentaires, l'un pour stocker le courant sélectionné UITextField (que j'ai nommé activeField), un pour indiquer si le point de vue actuel a été déplacé, et à indiquer si le clavier est affiché.
C'est la façon dont les deux
UITextField
délégué méthodes regardez maintenant:Lorsque la vue est chargé, les deux observateurs sont créés:
Et les méthodes correspondantes sont mises en œuvre comme suit:
Ce code fonctionne maintenant comme prévu. Le clavier n'est rejetée lorsque le bouton est pressé, sinon il reste visible et la vue ne sont pas déplacés.
Comme une note complémentaire, je pense qu'il est possible d'obtenir la
animationDuration
dynamiquement en demandant à laNSNotification
objet, puisque j'ai déjà joué avec une solution similaire, mais ne pas le faire fonctionner (ce qui est le cas maintenant).animationDuration
etanimationCurve
valeurs, vous devez utiliser leUIKeyboardAnimationDurationUserInfoKey
etUIKeyboardAnimationCurveUserInfoKey
userInfo valeurs.Ce point de vue contrôleur doit être
UITextView
Délégué, et vous devez définirself.textview.delegate = self
dansviewdidload
Assez de solution facile, fonctionne avec tous les formats d'écran
Tout d'abord vous devez vous intégrer UITextFields à un UIScrollView. Dans mon cas, j'ai eu plusieurs UITextFields et un UITextView.
Alors vous devez hériter de UITextFieldDelegate, UITextViewDelegate.
class SettingsVC: UIViewController, UITextFieldDelegate, UITextViewDelegate
Attribuer textfield et textview délégués de soi.
fullNameTextField.delegate = self
usernameTextField.delegate = self
websiteTextField.delegate = self
profileDescription.delegate = self
Ensuite utiliser ce code:
JS:
En bref, vous vous abonnez à UIKeyboardDidShow de notification.
Lorsque vous appuyez sur textField ou textView clavier est affiché et vous prenez le clavier du cadre et de cadre de l'élément d'entrée lorsque vous avez appuyé sur. Convertir viewController du système de coordonnées et de comparer l'élément d'entrée est le point le plus bas à un clavier le plus élevé. Si un élément de la partie inférieure est plus faible que le clavier le plus élevé, de définir le décalage de containerScrollView à la différence entre eux.
JS: