1686 votes

Comment faire un UITextField monter quand le clavier est présent

Avec le SDK de l'iPhone:

J'ai un UIView avec UITextFields qui affiche un clavier. J'en ai besoin pour être en mesure de:

  1. Permettent de faire défiler le contenu de l' UIScrollView voir les autres champs de texte une fois que le clavier est mis en place

  2. Automatiquement de "saut" (en défilant vers le haut) ou le raccourcissement

Je sais que j'ai besoin d'un UIScrollView. J'ai essayé de changer la classe de mon UIView d'un UIScrollView mais je suis toujours incapable de faire défiler les zones de texte vers le haut ou vers le bas.

Ai-je besoin d'une UIView et un UIScrollView? Peut-on aller dans l'autre? [EDIT: maintenant, je sais que vous voulez un UIView à l'intérieur d'un UIScrollView, et le truc, c'est de par programmation à définir la taille du contenu de l' UIScrollView de la taille de l'image de l' UIView.]

Ensuite ce qui doit être mis en œuvre afin de faire défiler automatiquement les actifs champ de texte?

Idéalement autant de la mise en place des composants que possible sera fait dans Interface Builder. J'aimerais qu'écrire du code pour quels besoins.

Remarque: l' UIView (ou UIScrollView) que je travaille avec est élevé par un tabbar (UITabBar), qui a besoin pour fonctionner normalement.


Edit: je suis l'ajout de la barre de défilement juste pour quand le clavier est en place. Même s'il n'est pas nécessaire, je me sens comme il fournit une meilleure interface, car alors l'utilisateur peut faire défiler et de modifier des zones de texte, par exemple.

J'ai eu de travail où j'ai modifier la taille du cadre de l' UIScrollView lorsque le clavier passe en haut et en bas. Je suis tout simplement à l'aide de:

-(void)textFieldDidBeginEditing:(UITextField *)textField { 
    //Keyboard becomes visible
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
                     scrollView.frame.origin.y, 
scrollView.frame.size.width,
scrollView.frame.size.height - 215 + 50);   //resize
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
   //keyboard will hide
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
       scrollView.frame.origin.y, 
     scrollView.frame.size.width,
      scrollView.frame.size.height + 215 - 50); //resize
}

Toutefois, cela ne signifie pas automatiquement "move up" ou centre de la baisse des champs de texte dans la zone visible, qui est ce que je voudrais vraiment.

1035voto

RPDP Points 1408
<ol> <li><p>Vous aurez besoin un affichage à défilement si le contenu que vous avez maintenant ne rentre pas dans l’écran de l’iPhone. (Si vous ajoutez l’affichage à défilement juste pour compenser le parchemin de textfield lorsque clavier s’affiche, puis il n'est pas nécessaire.)</p></li> <li><p>Pour montrer les textfields sans être caché par le clavier, la norme consiste à déplacer vers le haut/bas estime avoir textfields chaque fois que le clavier s’affiche.</p></li> <p>Voici un exemple de code :</p><pre><code></code></pre></ol>

445voto

Shiun Points 2401

J'ai été aussi avoir beaucoup de problème avec un UIScrollView de la composition de plusieurs UITextFields, dont un ou plusieurs d'entre eux serait obscurcie par le clavier quand ils sont en cours d'édition.

Voici quelques choses à considérer si votre UIScrollView n'est pas correctement défilement.

1) s'Assurer que votre contentSize est très supérieure à l' UIScrollView taille de l'image. La manière de comprendre l' UIScrollViews , c'est que l' UIScrollView , c'est comme une fenêtre de visualisation sur le contenu défini dans la contentSize. Donc dans l'ordre pour l' UIScrollview pour faire défiler n'importe où, le contentSize doit être supérieure à la UIScrollView. Autre chose, il n'y a pas de défilement nécessaire que tout ce que définis dans la contentSize est déjà visible. BTW, par défaut contentSize = CGSizeZero.

2) Maintenant que vous comprenez que l' UIScrollView est vraiment une fenêtre sur votre "contenu", la façon de s'assurer que le clavier n'est pas obscurcir votre UIScrollView's affichage "de la fenêtre" serait pour redimensionner l' UIScrollView , de sorte que lorsque le clavier est présent, vous avez l' UIScrollView de la taille de la fenêtre juste à l'original, UIScrollView cadre.taille.hauteur moins la hauteur du clavier. Cela permettra d'assurer que votre fenêtre n'est que la petite zone visible.

3) le hic, c'est Lorsque j'ai mis en œuvre ce j'ai pensé que j'aurais à obtenir l' CGRect de la édités textfield et appelez - UIScrollView's scrollRecToVisible méthode. J'ai mis en place l' UITextFieldDelegate méthode textFieldDidBeginEditing avec l'appel à l' scrollRecToVisible méthode. Cela fait déjà travaillé avec un étrange effet secondaire que le défilement serait composant logiciel enfichable de l' UITextField en position. Pendant longtemps je ne pouvais pas comprendre ce que c'était. Ensuite, j'ai commenté l' textFieldDidBeginEditing Délégué de la méthode et c'est tout le travail!!(???). Comme il s'est avéré, je crois que l' UIScrollView fait implicitement apporte actuellement édité UITextField dans le visible de la fenêtre implicitement. Ma mise en œuvre de l' UITextFieldDelegate méthode et de l'appel ultérieur à l' scrollRecToVisible était redondant, et a été la cause de l'étrange effet secondaire.

Voici donc les étapes pour bien défilement) UITextField en UIScrollView en place lorsque le clavier apparaît.

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.


- (void)viewDidLoad 
{
     [super viewDidLoad];

        // register for keyboard notifications
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(keyboardWillShow:) 
                                                     name:UIKeyboardWillShowNotification 
                                                   object:self.view.window];
        // register for keyboard notifications
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(keyboardWillHide:) 
                                                     name:UIKeyboardWillHideNotification 
                                                   object:self.view.window];
            keyboardIsShown = NO;
                //make contentSize bigger than your scrollSize (you will need to figure out for your own use case)
            CGSize scrollContentSize = CGSizeMake(320, 345);
            self.scrollView.contentSize = scrollContentSize;
    }

    - (void)keyboardWillHide:(NSNotification *)n
    {
        NSDictionary* userInfo = [n userInfo];

        // get the size of the keyboard
        CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;


        // resize the scrollview
        CGRect viewFrame = self.scrollView.frame;
        // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
        viewFrame.size.height += (keyboardSize.height - kTabBarHeight);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [self.scrollView setFrame:viewFrame];
        [UIView commitAnimations];

        keyboardIsShown = NO;
    }

- (void)keyboardWillShow:(NSNotification *)n
{
    // This is an ivar I'm using to ensure that we do not do the frame size adjustment on the `UIScrollView` if the keyboard is already shown.  This can happen if the user, after fixing editing a `UITextField`, scrolls the resized `UIScrollView` to another `UITextField` and attempts to edit the next `UITextField`.  If we were to resize the `UIScrollView` again, it would be disastrous.  NOTE: The keyboard notification will fire even when the keyboard is already shown.
    if (keyboardIsShown) {
        return;
    }

    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // resize the noteView
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height -= (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];
    keyboardIsShown = YES;
}
  1. s'inscrire pour le clavier notifications à l' viewDidLoad
  2. annuler l'inscription pour le clavier nofitications en viewDidUnload
  3. s'assurer que l' contentSize est définie et plus grande que votre UIScrollView à viewDidLoad
  4. rétrécir l' UIScrollView lorsque le clavier est présent
  5. revenir l' UIScrollView lorsque le clavier s'en va.
  6. utiliser un ivar pour détecter si le clavier est déjà indiqué sur l'écran depuis le clavier notifications sont envoyées à chaque fois un UITextField est à onglets, même si le clavier est déjà présent pour éviter le rétrécissement de l' UIScrollView alors qu'il est déjà rétréci

Une chose à noter est que l' UIKeyboardWillShowNotification le feu, même lorsque le clavier est déjà sur l'écran lors de l'onglet sur un autre UITextField. J'ai pris soin de cela en utilisant un ivar pour éviter le redimensionnement de la UIScrollView lorsque le clavier est déjà sur l'écran. Par inadvertance, le redimensionnement de la UIScrollView lorsque le clavier est déjà là serait désastreux!

Espérons que ce code permet d'économiser de beaucoup de maux de tête.

270voto

DK_ Points 1171

C'est en fait le meilleur de l'utilisation d'Apple de mise en œuvre, comme indiqué dans les docs. Toutefois, le code qu'ils fournissent est défectueux. Remplacer la partie trouvé dans keyboardWasShown: juste en dessous des commentaires à la suivante:

CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
CGPoint origin = activeField.frame.origin;
origin.y -= scrollView.contentOffset.y;
if (!CGRectContainsPoint(aRect, origin) ) {
    CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-(aRect.size.height)); 
    [scrollView setContentOffset:scrollPoint animated:YES];
}

Les problèmes avec Apple code sont les suivants: (1) Ils ont toujours calculer si le point est à l'intérieur de la vue de l'image, mais c'est un ScrollView, de sorte qu'il peut déjà ont défilé et vous devez rendre compte du décalage:

origin.y -= scrollView.contentOffset.y

(2) passage de la contentOffset par la hauteur du clavier, mais nous voulons au contraire (nous voulons déplacer la contentOffset par la hauteur qui est visible sur l'écran, pas de ce qui ne l'est pas):

activeField.frame.origin.y-(aRect.size.height)

244voto

sumanthkodi Points 161
<p>En <code></code> et en <code></code> appeler la fonction <code></code> comme suit :<pre><code></code></pre><p>J’espère que ce code vous aidera.</p></p>

134voto

DAS Points 1082
<p><strong>Juste à l’aide de TextFields :</strong><p>1 a) en utilisant <code></code> : sélectionnez tous les TextFields = > Modifier = > incorporer dans = > ScrollView</p><p>1 b) incorporer manuellement TextFields en UIScrollView appelé scrollView</p><p>2) jeu de<code></code></p><p>3) set chaque <code></code> (ou établir des connexions dans <code></code> )</p><p>4) <strong>copier / coller :</strong></p><pre><code></code></pre></p>

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