85 votes

iPhone: masquer la barre de recherche UITableView par défaut

J'ai utilisé l'Interface Builder pour créer une vue de la table, à laquelle j'ai ajouté de la bibliothèque de la Barre de Recherche de Recherche de Contrôleur d'Affichage à ajouter des fonctionnalités de recherche. Cependant, IB configurer de façon à ce que la barre est visible en haut de l'écran lorsque la vue est affichée pour la première fois.

Je voudrais savoir comment avoir la barre de recherche seront masqués par défaut, mais encore à défilement avec la vue du tableau (voir le Mail d'Apple, l'application pour un exemple). J'ai essayé de les appeler, scrollRectToVisible:animated: en viewDidLoad pour faire défiler l'affichage de la table vers le bas, mais en vain. Quel est le meilleur moyen de cacher la barre de recherche par défaut?

116voto

Andreas Points 4133

Assurez-vous d'abord, pour ajouter le UISearchBar à la tableHeaderView de la UITableView de sorte qu'il défile avec la table du contenu et n'est pas fixé sur le dessus de la vue.

La barre de recherche n'est pas compté comme une ligne dans la tableview, donc si vous faites défiler le haut de la tableview à la première ligne, il "se cache" la barre de recherche:

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

Assurez-vous de ne pas faire défiler la tableview avant qu'il contient des données (scrollToRowAtIndexPath génère une exception si le indexPath ne pointe pas vers une ligne valide (c'est à dire si la tableview est vide)).

45voto

bandejapaisa Points 8425

N'ajoutez pas UIScrollBar en tant que sous-vue de UITableView, ce n'est pas nécessaire.

UITableView a une propriété tableHeaderView qui est parfaite pour cela:

 - (void) viewDidLoad {
    [super viewDidLoad]; 
    self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
    self.searchBar.showsCancelButton = YES;    
    self.searchBar.delegate = self;
    self.tableView.tableHeaderView = self.searchBar;     
}
 

Si vous ne voulez pas le voir par défaut:

 - (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView setContentOffset:CGPointMake(0, 44)];
}
 

Je reçois aussi le bouton d'annulation pour le cacher à nouveau .... (et retirer le clavier)

 - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
    [self.searchBar resignFirstResponder];
}
 

25voto

Andrei Points 2226

Le contentOffset a été noté dans les commentaires de Tim et Joe D'Andrea, mais ceci est un peu plus étendu en ajoutant une animation pour masquer la barre de recherche. J'ai remarqué qu'il est un peu inattendu que la barre de recherche disparaisse tout simplement.

Une petite mise à jour pour ceux qui veulent cibler iOS 4.0 et les versions ultérieures, essayez ceci:

 [UIView animateWithDuration:0.4 animations:^{
    self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
 } completion:nil];
 

Réponse précédente:

 [UIView beginAnimations:@"hidesearchbar" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];

self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);

[UIView commitAnimations];
 

8voto

matejkramny Points 1853

Il y a beaucoup de réponses à cette solution, mais aucune n'a très bien fonctionné pour moi.

Cela fonctionne parfaitement. Aucune animation, et est fait sur -viewDidLoad

  - (void)viewDidLoad {
     [super viewDidLoad];
     self.tableView.contentOffset = CGPointMake(0,  self.searchBar.frame.size.height - self.tableView.contentOffset.y);
 }
 

Remarque:

Le code suppose que vous avez le searchBar @property lié à la barre de recherche. Sinon, vous pouvez utiliser self.searchDisplayController.searchBar place

3voto

user3246173 Points 49

Notez que la réponse acceptée plantera s'il n'y a pas de données dans la table. Et l'ajouter à viewDidLoad peut ne pas fonctionner dans certaines circonstances.

 [yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; // crashes if no rows/data
 

Par conséquent, ajoutez plutôt cette ligne de code:

 - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [yourTableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height)];
}
 

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