10

Ho un UITableView con una barra di UISearchController di ricerca nel UINavigationBar, tutto funziona perfettamente, ma quando spingo a seguito dei risultati ricercate del UISearchController, e torno l'UITableView è sotto il NavBar, è così che inizializzare la UISearchController:UITableView con UISearchController andare sotto barra di navigazione quando si entra in una vista risultato e tornare

 self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
     self.searchController.delegate = self; 
     self.searchController.searchResultsUpdater = self; 

     self.searchController.searchBar.delegate = self; 
     self.searchController.dimsBackgroundDuringPresentation = NO; 
     self.searchController.hidesNavigationBarDuringPresentation = NO; 
     self.searchController.searchBar.placeholder = NSLocalizedString(@"Local Search", @""); 
     self.searchController.searchBar.frame = CGRectMake(0, -5, [UIScreen mainScreen].bounds.size.width, 44); 


     ctrl = [[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 44)]; 
     ctrl.backgroundColor = [UIColor clearColor]; 
     ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     [ctrl addSubview:self.searchController.searchBar]; 
     self.navigationItem.titleView = ctrl; 
     self.definesPresentationContext = YES; 

la barra di ricerca viene visualizzato perfettamente nel UINavigationBar, poi quando cerco qualcosa e premo il controller della vista di una risultati come this:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    DetailListController *detailList = [[DetailListController alloc] init]; 
    [self.navigationController pushViewController:detailList animated:YES]; 
} 

quando torno al UITableView fare questo:

[self.navigationController popViewControllerAnimated:YES]; 

il UITableView è sotto il UINavigationBar, come posso risolvere questo problema?

grazie

risposta

9

Ho avuto esattamente lo stesso problema, impostando extendedLayoutIncludesOpaqueBars-YES/true nel controller della vista, che presenta regolatore di ricerca, sembra risolvere il problema.

self.extendedLayoutIncludesOpaqueBars = YES 

Come una parola di cautela: l'impostazione di questa proprietà modifica il valore dell'offset del contenuto verticale della vista di scorrimento.

0

Ciò che mi ha aiutato è stato quello di creare il mio vincolo di layout programatically

tableView.top <-> tableView.superview.top 

invece di solito utilizzato

tableView.top <-> tableView.superview.topLayoutGuide 

e l'impostazione

view.edgesForExtendedLayout = .Top 

Ho provato innumerevoli combinazioni di layout e vincoli e niente ha funzionato tranne questo. Insetto davvero fastidioso

7

Questo è un bug estremamente frustrante in UIKit. Quello che sembra accadere è che la guida al layout di presentazione del controller di visualizzazione viene reimpostata su 0, il che significa che è ora sotto la barra di navigazione. La guida al layout è una proprietà di sola lettura, quindi non è possibile correggerla modificando direttamente. Tuttavia, ho trovato un trucco per farlo ripristinare al valore corretto. Aggiungi questo al tuo UISearchControllerDelegate:

- (void)didDismissSearchController:(UISearchController *)searchController 
{ 
    UINavigationController *nav = self.navController; // you muse save this earlier 

    // force to layout guide to reset by pushing a dummy controller and popping it right back 
    [nav pushViewController:[UIViewController new] animated:NO]; 
    [nav popViewControllerAnimated:NO]; 
} 
+4

Uno di quelli che funziona ma ti ha fatto sentire triste. – GuillermoMP

+0

grazie. questo funziona ma sono d'accordo che è una soluzione triste –

+0

Qualcuno ha aperto un radar aperto per questo? – PaulRBerg