2009-07-03 19 views
25

Ho un UITableView con UISearchBar come tableViews.tableHeaderView. Proprio come il nuovo Mail.app, Notes.app, ecc. In 3.0. Voglio nascondere la barra di ricerca finché l'utente non la trascina nella sua vista.Scorri UITableView in modo che l'intestazione non sia visibile

Il mio tentativo funziona solo quando ci sono un paio di elementi nel TableView, in modo che il TableView in realtà vuole scorrere. Lo chiamo in loadView:

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

Tuttavia, sembra che Apple gestisca diversamente tale seracbar. Dopo aver trascinato fuori la barra di ricerca non sembra più essere limitato alle tablecell (in Notes.app, non in Mail.app).

Ma forse Apple ha un metodo distinto per il nuovo comportamento 3.0 e non riesco proprio a trovarlo?

+0

Checkout paio di nuove proprietà per '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) –

risposta

33

Forse si può provare in questo modo ...

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

Funziona perfettamente. – OlivaresF

+1

È necessario farlo ogni volta che viene ricaricata la vista tabella. [self.tableView reloadData]; – Thiru

+9

Non funziona quando il numero di righe è inferiore al numero totale di righe che si adattano allo schermo. Eventuali soluzioni alternative per questo scenario? – Zorayr

25

Ha lavorato anche per me. Ho utilizzato quanto segue:

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

per interrogare l'altezza della barra di ricerca.

+1

Adorabile e semplice, anche se ho aggiunto il parametro animato: YES per migliorare l'aspetto della cosa. – PKCLsoft

+0

Perfetto! Semplicemente aggiunto in viewWillAppear e ho ottenuto il risultato che stavo cercando. – anasaitali

10

Questo quello che si ottiene lo stesso comportamento esatto come 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

Questo funziona per me.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableView.bounces = YES; 
} 

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

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

certo senso mi piace farlo in questo modo:

- (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]; 
} 

In questo modo non si ha realmente bisogno di preoccuparsi di quanto è alto l'intestazione è. Funziona!

+1

La soluzione arresta l'app se la vista tabella non ha caricato le righe o ha zero righe. – Zorayr

+0

Oh capita. Grazie per il commento Zorayr – Caborca87

0

ho dovuto scorrere prima in alto poi setContentOffset-0, allora Searchbar sarà visibile:

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