web-dev-qa-db-fra.com

iPhone - Le clavier cache TextField

J'utilise UITextField pour recevoir des entrées d'utilisateur. Cependant, comme mes champs de texte sont situés vers le milieu/le bas de la pointe, ils sont masqués lorsque le clavier apparaît. Y a-t-il un moyen de le glisser avec le clavier pour qu'il soit en haut du clavier lors de la sélection? De plus, puisque j'utilise également le pavé numérique, existe-t-il un moyen simple d'inclure un bouton terminé quelque part?

Merci pour l'aide.

21
intl

Pour faire défiler lorsque le clavier apparaît, j'aime ce tutoriel de Cocoa With Love.

Pour fermer le clavier numérique, vous pouvez placer un bouton personnalisé "Terminé" sur le clavier ou créer un bouton invisible sur le reste de l'écran. J'ai fait ce dernier avec du code, mais ce tutoriel utilise Interface Builder.

16
gerry3

J'ai fait une application simple pour ce problème. Il vérifie automatiquement la position du champ de texte et si le clavier le cache, il se déplacera automatiquement selon les besoins.


- (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
{
    int animatedDistance;
    int moveUpValue = textField.frame.Origin.y+ textField.frame.size.height;
    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {

        animatedDistance = 216-(460-moveUpValue-5);
    }
    else
    {
        animatedDistance = 162-(320-moveUpValue-5);
    }

    if(animatedDistance>0)
    {
        const int movementDistance = animatedDistance;
        const float movementDuration = 0.3f; 
        int movement = (up ? -movementDistance : movementDistance);
        [UIView beginAnimations: nil context: nil];
        [UIView setAnimationBeginsFromCurrentState: YES];
        [UIView setAnimationDuration: movementDuration];
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);       
        [UIView commitAnimations];
    }
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField {

    [textField resignFirstResponder];
    return YES;
}
26
ValayPatel

Vous devrez le faire manuellement. Découvrez cette réponse . UITextField: déplacez la vue lorsque le clavier apparaît

3
Ben Zotto

si quelqu'un en a besoin, j'ai traduit la solution de ValayPatel en Swift

func animatedTextField(textField: UITextField, up: Bool){
    var animatedDistance : Int = 0
    let moveUpValue : Int = Int(textField.frame.Origin.y) + Int(textField.frame.size.height)

    switch UIDevice.currentDevice().orientation {
    case .Portrait , .PortraitUpsideDown:
        animatedDistance = 216 - (460 - moveUpValue - 5)
    default:
        animatedDistance = 162 - (320 - moveUpValue - 5)
    }

    if (animatedDistance > 0 ){

        let movementDistance : Int = animatedDistance
        let movementDuration : Float = 0.3
        let movement = up ? -movementDistance : movementDistance
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(NSTimeInterval(movementDuration))
        self.view.frame = CGRectOffset(self.view.frame, 0, CGFloat(movement))
        UIView.commitAnimations()

    }

}
3
Andrés Sánchez

Utilisez ce code:

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:) 
                                             name:UIKeyboardDidShowNotification 
                                           object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidHide:) 
                                             name:UIKeyboardDidHideNotification 
                                           object:self.view.window];
}


- (void)viewDidDisappear:(BOOL)animated {
// unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIKeyboardDidShowNotification 
                                              object:nil]; 
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIKeyboardDidHideNotification 
                                              object:nil];
}

- (void)keyboardDidHide:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft)) 
    viewFrame.size.height += 140;
else viewFrame.size.height += 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = NO;
}

- (void)keyboardDidShow:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft)) 
    viewFrame.size.height -= 140;
else viewFrame.size.height -= 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = YES; }

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
CGRect viewFrame = scrollView.frame;
if ((interfaceOrientation == UIDeviceOrientationLandscapeRight) || (interfaceOrientation == UIDeviceOrientationLandscapeLeft)) //wants to change to landscape mode
    if (keyboardVisible == NO)//currently in portrait,check if keyboard was present
            viewFrame.size = CGSizeMake(480,250);
    else viewFrame.size = CGSizeMake(480,170);
else {//wants to change to portrait mode
    if (keyboardVisible == NO)//currently in landscape,check if keyboard was present
        viewFrame.size = CGSizeMake(320,416);
    else viewFrame.size = CGSizeMake(320,200);
}
scrollView.frame = viewFrame;

return YES;
}

Fonctionne aussi en mode paysage, mais uniquement pour iphone. Pour iPad, modifiez les paramètres du cadre en conséquence. La méthode textFieldShouldReturn: fera en sorte que le clavier se cache lorsque vous appuyez sur la touche return. J'espère que cela t'aides...

3
tipycalFlow

Le code ci-dessous fonctionne parfaitement pour moi.

[textFieldFocused becomeFirstResponder];
[self.view addSubview:startView];
[textFieldFocused resignFirstResponder];
3
idea2real

Cette situation est un peu nulle sur l'iPhone. Ce que vous êtes censé faire est de concevoir votre interface de manière à ce que les champs soient visibles lorsque le clavier apparaît ou de déplacer le champ vers le haut lorsque le clavier apparaît. (Et redescendre quand vous avez terminé)

Je suggère de regarder certaines applications Apple telles que Contacts ou Paramètres pour voir comment elles gèrent cela.

De plus, je suis sûr que l'iPhone HIG a quelque chose à dire à ce sujet.

1
Stefan Arentz

J'ai cherché d'innombrables réponses à des questions similaires. Pour les applications à écran unique de base, cette solution fonctionne à merveille et est incroyablement simple à mettre en œuvre: https://github.com/michaeltyson/TPKeyboardAvoiding

Certes, il existe des solutions plus élégantes, mais cela permettra d'accomplir le travail rapidement.

0
Matt Perejda

Je sais que je suis un peu en retard pour répondre à cette question, mais j'ai trouvé une solution très simple. Si vous utilisez un contrôleur UITableView plutôt qu'un UIViewController contenant un objet tableView, ce problème n'apparaît pas.

Lorsque vous cliquez sur le champ de texte qui se trouve en bas du tableau, le clavier apparaît et l'affichage du tableau défile automatiquement jusqu'à ce que le champ de texte en cours de modification soit visible.

Toutefois, le défilement automatique ne fonctionne pas lorsque nous utilisons le bouton de retour du clavier. Dans ce scénario, faites défiler la table manuellement pour afficher le champ de texte.

J'espère que ça aide

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

Veuillez utiliser ce code dans votre fichier controller.m de vue ..Utilisez ce code lorsque vous cliquez sur le champ de texte pour que le clavier apparaisse.

0
Roby

C'est simple comme mettre UITableView en mode édition!

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEditing:YES];
}

Si vous souhaitez masquer une suppression de bulles, à la gauche d'une cellule, implémentez une méthode UITableViewDelegate:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

    return NO;
}
0
Adobels
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"%f",textField.frame.Origin.y);

    CGPoint scrollPoint = CGPointMake(0, textField.frame.Origin);
    [scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField 
{
    [scrollView setContentOffset:CGPointZero animated:YES];
}
0
Naresh Jain