2012-12-24 8 views
10

Ho implementato una barra di ricerca e un controller di visualizzazione della ricerca nella parte superiore della visualizzazione tabella.Nascondi UISearchBar finché l'utente non scorre?

Quando la vista carica la barra di ricerca e gli ambiti relativi sono sempre visibili.

C'è un modo semplice per nasconderlo fino a quando l'utente non scorre, come succede nell'app Music?

risposta

17

è necessario aggiungere barra di ricerca come intestazione della vista tabella e quindi impostare la proprietà contentoffset di vista tabella in viewDidLoad come,

[self.tableView setContentOffset:CGPointMake(0,44) animated:YES];//or (0, 88) depends on the height of it 

Per il regolatore di visualizzazione di ricerca, si può provare anche questo,

[self.searchDisplayController setActive:NO animated:YES]; 
+1

modificando il contenuto offset ha funzionato bene, grazie! – kain

+3

La soluzione non nasconde la barra di ricerca quando tutte le righe nella tabella si adattano allo schermo. Eventuali soluzioni alternative per questo tipo di scenario? – Zorayr

+0

@Zorayr: hai trovato una soluzione funzionante per le tabelle in cui le celle si adattano all'intero schermo? Avere lo stesso problema. –

11

un altro approccio senza hardcode

[self.tableView setContentOffset:CGPointMake(0.0, self.tableView.tableHeaderView.frame.size.height) animated:YES]; 
+0

Questo funziona perfettamente. Impressionante codercat! –

0

per iOS 7 e l'utilizzo di UINavigationController

[self.tableView setContentOffset:CGPointMake(0, self.searchBar.height + self.navigationController.navigationBar.height)]; 
0

modo migliore che ho fatto ricarica Tableview in

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:YES];  
    [self performSelector:@selector(reload:) withObject:nil afterDelay:0.0]; 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

- (void)reload:(__unused id)sender { 
     [self.searchDisplayController setActive:YES]; 
     [self.tableView reloadData]; 
     [self.refreshControl endRefreshing]; 
    } else { 
     [self.refreshControl endRefreshing]; 
     [[[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
    } 
} 

Grazie

7

Dopo qualche ora di Tirare i capelli, qualcosa che funziona

  • su iOS 9
  • non dipende dal numero di righe della tabella
  • con righe altezza variabile

    Considerando barra di ricerca è il tableView.tableHeaderView

    @interface MyTableViewController() 
    
    @property (nonatomic, assign) BOOL firstLayout; 
    
    @end 
    
    - (void) viewDidLoad { 
    [super viewDidLoad]; 
    
    
    self.firstLayout = YES; 
    //your code 
    
    } 
    
    -(void)viewDidLayoutSubviews{ 
    
    [super viewDidLayoutSubviews]; 
    
    if(self.firstLayout){ 
    CGPoint offset = CGPointMake(0, self.tableView.tableHeaderView.frame.size.height - self.tableView.contentInset.top); 
    [self.tableView setContentOffset:offset]; 
    
        self.firstLayout = NO; 
    
    } 
    
    } 
    
+0

grande +1 per la completezza. – Jake

0

Questo funziona bene su iOS9 +

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.tableView.contentOffset = CGPointMake(0, -20); 
    }); 
}