2009-07-03 5 views
25

J'ai un UITableView avec un UISearchBar comme tableViews.tableHeaderView. Tout comme le nouveau Mail.app, Notes.app, etc. dans 3.0. Je veux cacher le SearchBar jusqu'à ce que l'utilisateur le traîne à sa vue.Faites défiler UITableView pour que l'en-tête ne soit pas visible

Ma tentative ne fonctionne que s'il y a quelques éléments dans la tableView, de sorte que la tableView veut réellement faire défiler. Je l'appelle dans loadView:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self._tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

Néanmoins, il semble que Apple gère une telle serachbar différemment. Après avoir extrait la barre de recherche, il ne semble plus être lié aux tablecells (dans Notes.app, pas dans Mail.app).

Mais peut-être que Apple a une méthode distincte pour ce nouveau comportement de 3.0, et je ne trouve tout simplement pas?

+0

Commander deux nouvelles propriétés 'UIViewController'. [https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1](https://developer. apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1) –

Répondre

33

Peut-être que vous pouvez essayer cette façon ...

[self.tableView setContentOffset:CGPointMake(0,40)]; 
+0

Fonctionne parfaitement. – OlivaresF

+1

Besoin de le faire à chaque fois que la vue de table est rechargée. [self.tableView reloadData]; – Thiru

+9

Ne fonctionne pas lorsque le nombre de lignes est inférieur au nombre total de lignes qui correspondent à l'écran. Toutes les solutions de contournement connues pour ce scénario? – Zorayr

25

travaillé pour moi aussi. J'ai utilisé ce qui suit:

[self.tableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height) animated:NO]; 

pour interroger la hauteur de la barre de recherche.

+1

Lovelly et simple, mais j'ai ajouté le paramètre animé: OUI afin d'améliorer l'apparence de la chose. – PKCLsoft

+0

Parfait! Je l'ai simplement ajouté dans viewWillAppear et j'ai obtenu le résultat que je cherchais. – anasaitali

10

Celui-ci vous obtient le même comportement que iPod.app:

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

CGFloat searchBarHeight = CGRectGetHeight([[[self searchDisplayController] searchBar] frame]); 
if ([[self tableView] contentOffset].y < searchBarHeight) 
    [[self tableView] setContentOffset:CGPointMake(0, searchBarHeight)]; 
} 
3

Cela fonctionne pour moi.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableView.bounces = YES; 
} 

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

    [self.tableView setContentOffset:CGPointMake(0, 44)]; 
} 
-2

Je aime bien le faire de cette façon:

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

    // Hide the table view header by default. 
    NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

De cette façon, vous ne vraiment pas à vous soucier de quelle taille de votre tête est. Cela fonctionne juste!

+1

La solution plante l'application si la vue de la table n'a pas chargé les lignes ou n'a pas de lignes. – Zorayr

+0

Oh gotcha. Merci pour le commentaire Zorayr – Caborca87

0

je devais faire défiler d'abord vers le haut puis setContentOffset-0, alors SearchBar sera visible:

self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false) 
self.tableView.setContentOffset(CGPointMake(0, 0), animated: false) 
Questions connexes