2009-08-21 4 views
2

Je sais que vous pouvez utiliser la propriété "Inset" dans Interface Builder pour faire en sorte qu'une vue de défilement soit insérée depuis la fenêtre principale afin qu'elle ne soit pas inférieure à la contrôles sur l'écran comme une barre d'onglets, mais comment pouvez-vous faire cela par programmation pour ajuster quand un clavier est ajouté à l'écran? Actuellement, ma vue de défilement a des cellules sous le clavier qui ne peuvent pas être atteintes car la vue enregistre toujours le bas de la vue défilée comme le bas du téléphone, pas le haut du clavier. De l'aide?Modification des incrustations de défilement d'UITableView pour refléter la taille d'un clavier iPhone

Répondre

7
#pragma mark Keyboard Handling 



- (void) viewDidAppear:(BOOL) ani { 
    onscreen = YES; 

    NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 
    [center addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil]; 
    [center addObserver:self selector:@selector(keyboardDidAppear:) name:UIKeyboardDidShowNotification object:nil]; 
    [center addObserver:self selector:@selector(keyboardWillDisappear:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void) viewDidDisappear:(BOOL) ani { 
    onscreen = NO; 

    NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 
    [center removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [center removeObserver:self name:UIKeyboardDidShowNotification object:nil]; 
    [center removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void) keyboardWillAppear:(NSNotification*) n { 
    NSLog(@"Keyboard is about to appear"); 
} 

- (void) keyboardDidAppear:(NSNotification*) n { 

    CGRect bounds = [[[n userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue]; 
    bounds = [self.view convertRect:bounds fromView:nil]; 

    CGRect tableFrame = searchResultsTable.frame; 
    tableFrame.size.height -= bounds.size.height; // subtract the keyboard height 
    if (self.tabBarController != nil) { 
     tableFrame.size.height += 48; // add the tab bar height 
    } 

    [UIView beginAnimations:nil context:NULL]; 

    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkDidEnd:finished:contextInfo:)]; 
    searchResultsTable.frame = tableFrame; 
    [UIView commitAnimations]; 

    //[self hideEditorView:currentEditorView]; 
    //[currentEditorView removeFromSuperview]; 
} 

- (void) shrinkDidEnd:(NSString*) ident finished:(BOOL) finished contextInfo:(void*) nothing { 
    NSIndexPath* sel = [searchResultsTable indexPathForSelectedRow]; 

    if (![[searchResultsTable indexPathsForVisibleRows] containsObject:sel]) 
    { 
     [searchResultsTable scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
    } 
} 

- (void) keyboardWillDisappear:(NSNotification*) n { 
    CGRect bounds = [[[n userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue]; 
    bounds = [self.view convertRect:bounds fromView:nil]; 

    CGRect tableFrame = searchResultsTable.frame; 
    tableFrame.size.height += bounds.size.height; // add the keyboard height 

    if (self.tabBarController != nil) { 
     tableFrame.size.height -= 48; // subtract the tab bar height 
    } 

    [UIView beginAnimations:nil context:NULL]; 

    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkDidEnd:finished:contextInfo:)]; 
    searchResultsTable.frame = tableFrame;  
    [UIView commitAnimations]; 

    [searchResultsTable scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 
+0

c'est une alternative, et je l'aime parce que de cette façon la vue de table ne doit pas être le délégué de les champs de texte ...+1 – Daniel

+1

Vous ne devriez pas utiliser un trait de soulignement comme préfixe pour vos méthodes, car elles pourraient entrer en conflit avec les méthodes d'Apple. Vous devriez utiliser quelque chose comme _slf à la place. –

+0

@Rafael là vous allez, enlevé les traits de soulignement :) – slf

1

Deux options. (Quand vous dites défiler vue je pense que vous voulez dire vue de table puisque le titre le suggère)

  1. Utilisez un UITableViewController, si le clavier est ajouté à la vue de la table, je crois qu'il fera le Redimensionnement pour vous

  2. dans le protocole textfield ou zone de texte dans la méthode - (void)textFieldDidBeginEditing:(UITextField *)textField, redimensionnez votre image de vue de la table et à la fin placèrent ne terminer l'édition arrière de sorte (celui-ci vous pouvez également faire si sa vue de défilement et non un tableView)

    • (void) textFie ldDidBeginEditing: (UITextField *) textField { CGRect frame = tableView.frame; // ou faites défiler la vue frame.size.height = frame.size.height- keyboardHeight; tableView.frame = cadre}

    • (void) textFieldDidEndEditing: (UITextField *) textField {CGRect frame = tableView.frame; // ou faites défiler la vue frame.size.height = frame.size.height + keyboardHeight; tableView.frame = cadre }

Hope this helps

+0

« Utiliser un UITableViewController » était l'indice le plus utile dans toutes les questions relatives à ce sujet. – hop

+0

pas vraiment. Je pense que l'événement pour le clavier comme indiqué ci-dessous ou être un délégué du champ de texte sont à la fois bien et facile à mettre en œuvre ... – Daniel

0

Une autre façon facile en utilisant Interface Builder ou un code

Réglez [Tableau Taille Pied de page Hauteur] propriété à 200 (jouer avec cela pour votre mise en page). Cela rend la table plus grande que le cadre englobant dans lequel elle est contenue, ce qui permet de faire défiler la table plus haut que la normale. Fonctionne parfaitement pour laisser l'utilisateur faire défiler la table vers le haut et vers le bas comme il le faut.

+0

Je pense que vous devriez utiliser Content/Scroller Insets pour ce genre de choses – kolinko

0

J'ai créé un petit projet qui résout ce problème avec le clavier, dans mon cas, j'ai seulement besoin de faire monter la vue de la table quand le clavier apparaît.

Espérons que cela aide!

http://git.io/BrH9eQ

Questions connexes