122 votes

Le clavier de l'iPhone couvre UITextField

J'ai une application dans laquelle, dans Interface Builder , j'ai configuré un UIView contenant un champ de texte au bas de la vue. Lorsque je lance l'application et que j'essaie d'entrer du texte dans ce champ, le clavier glisse au-dessus du champ pour que je ne puisse pas voir ce que je tape jusqu'à ce que je cache à nouveau le clavier.

Quelqu'un d'autre a-t-il rencontré ce problème et a-t-il trouvé un bon moyen de le résoudre sans pour autant faire défiler la vue parent ou déplacer le champ de texte plus haut sur l'écran?

291voto

Amagrammer Points 5064

La solution habituelle consiste à faire glisser le champ (et tout ce qui se trouve au-dessus) avec une animation, puis à revenir en arrière 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 sous forme d’unité. (J'appelle ces choses "plaques" comme dans "plaques tectoniques", mais c'est juste moi). Mais voici l'idée générale si vous n'avez pas besoin de vous compliquer.

 - (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}
 

38voto

cidered Points 2100

Cela a fonctionné à merveille pour moi coulissant uitextfields

En particulier, il présente l'avantage de calculer la distance d'animation des diapositives en fonction de la position du champ de texte.

28voto

IQKeyboardManager le faire pour vous avec AUCUNE LIGNE DE CODE, il suffit de faire glisser et de déposer liées fichier source du projet. IQKeyboardManager également de support de Dispositif d'Orientation, Automatique UIToolbar de Gestion, KeybkeyboardDistanceFromTextField et beaucoup plus que vous le pensez.

Voici mon approche de mise en œuvre de IQKeyboardManager.

Etape 1:- j'ai Ajouté mondial des notifications d' UITextField, UITextView, et UIKeyboard dans une classe singleton. Je l'appelle IQKeyboardManager.

Etape n ° 2:- Si trouvé UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotification ou UITextViewTextDidBeginEditingNotification des notifications, j'essaie de m' topMostViewController de la UIWindow.rootViewController de la hiérarchie. Afin de bien découvrir UITextField/UITextView sur, topMostViewController.view'image doit être ajusté.

Etape n ° 3:- j'ai calculé devrait distance de déplacement de l' topMostViewController.view à l'égard des premières répondu UITextField/UITextView.

Etape n ° 4:- j'ai déménagé topMostViewController.view.frame vers le haut/vers le bas en fonction de la distance de déplacement.

Etape 5:- Si trouvé UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotification ou UITextViewTextDidEndEditingNotification de notification, j'ai de nouveau essayer d'obtenir de l' topMostViewController de la UIWindow.rootViewController de la hiérarchie.

Etape 6:- j'ai calculé perturbé distance de topMostViewController.view qui doit être restauré à leur position d'origine.

Step7:- j'ai restauré topMostViewController.view.frame à la baisse selon la perturbés distance.

Step8:- j'ai instancié singleton IQKeyboardManager instance de la classe sur l'application de la charge, de sorte que chaque UITextField/UITextView dans l'app s'ajuste automatiquement en fonction de la distance de déplacement.

C'est tout

7voto

Boobalan Points 137

J'ai face à la même question en UITableView textField cellules. - Je résoudre ce problème par la mise en œuvre de méthode suivante pour écouter le clavier de notification.

Observateur pour les notifications ici:

[[NSNotificationCenter defaultCenter]addObserver:auto selector:@selector(keyboardWasShown:) nom:UIKeyboardWillShowNotification objet:nil];

[[NSNotificationCenter defaultCenter]addObserver:auto selector:@selector(keyboardWillBeHidden:) nom:UIKeyboardWillHideNotification objet:nil];

Poignée de ceux notification par ci-dessous à l'aide de la fonction:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 

7voto

stebooks Points 667

Pour développer Amagrammer, voici un exemple de classe:

LoginViewController.h

 @interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

@property (nonatomic, retain) IBOutlet UITextField    *emailTextField;
@property (nonatomic, retain) IBOutlet UITextField    *passwordTextField;
 

Notez que nous implémentons le "UITextFieldDelegate"

LoginViewController.m

 @implementation LoginViewController
@synthesize emailTextField=_emailTextField;
@synthesize passwordTextField=_passwordTextField;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        //Register to receive an update when the app goes into the backround
        //It will call our "appEnteredBackground method
        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(appEnteredBackground)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];
    }
    return self;
}


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
//This is called when the app goes into the background.
//We must reset the responder because animations will not be saved
- (void)appEnteredBackground{
    [self.emailTextField resignFirstResponder];
    [self.passwordTextField resignFirstResponder];
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X