29

Ho un UITableViewController con UISearchBar e UISearchDisplayController. Questo esiste all'interno di una vista container in un UIViewController che si trova in un UINavigationController. Ho fatto questa immagine per contribuire a descrivere la struttura:Il contenuto UITableView si sovrappone alla barra di stato quando UISearchBar è attivo

enter image description here

Questo è ciò che sembra davvero come:

enter image description here

Quando si tocca l'barra di ricerca, devo nascondere la barra di navigazione . Normalmente ciò accadrebbe da solo, ma dal momento che il mio UITableViewController si trova all'interno di una vista Container, devo gestirlo personalmente. Ecco come appare, quindi nota che la barra di stato è bianca perché la barra di navigazione è bianca, anche se al momento è nascosta.

enter image description here

Una volta mi metto a digitare in un testo di ricerca, i risultati mostrano l'alto. Se faccio scorrere verso l'alto questi risultati, passano sotto la barra di ricerca, ma si sovrappongono alla barra di stato che è molto poco attraente.

enter image description here

se il contenitore View non è coinvolto, quindi tutto questo funziona come previsto e il contenuto della tabella passa sotto la barra di stato, ma con la ContainerView coinvolti, il testo tavolo e barra di stato si scontrano.

Come si ottiene il testo per spostarsi sotto la barra di stato come normale?

risposta

2

Fondamentalmente ciò è dovuto alla traslucenza della barra di navigazione, solitamente la correzione del controller di visualizzazione che si sovrappone, correggendo gli insiemi superiori della vista o sottoview di proprietà se sono (o ereditano) da UIScrollView. Hai 2 opzioni, una è quella di impostare la traslucenza della barra di navigazione su no, l'altra è impostare il edgeForExtendedLayout su nessuno o lasciare solo il fondo.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { 
    self.navigationController.navigationBar.translucent = YES; 
} 

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { 
    self.navigationController.navigationBar.translucent = NO; 
} 

Questi consigli funziona solo su iOS7, se si distribuisce su più bassa di controllo di destinazione prima di impostazioni quelle proprietà.
Un altro modo, ma non ho provato potrebbe essere la lunghezza --topLayoutGuide e nel - searchDisplayControllerWillBeginSearch provare a impostare un TopInsets della stessa lunghezza. In questo modo dovresti comunque conservare la traslucenza.

+0

Sto avendo lo stesso problema esatto come il PO, ma io non sto mostrando un NavBar. Questo è in un controller di navigazione che seguo come popup modale. Poiché non visualizzo un NavBar, l'impostazione della traslucenza non risolve il problema. – Peter

+0

Provare con i bordi Per Esteso Allungato – Andrea

+0

molto probabilmente anche .. '-setAutomaticallyAdjustScrollInsets' – Andrea

0

Ho avuto lo stesso problema:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 
{ 
    controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar 
} 

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller 
{ 
    controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines 
} 
4

Provare a impostare la definesPresentationContext in viewDidLoad della vostra TableViewController

Swift

override func viewDidLoad() { 
    super.viewDidLoad() 

    definesPresentationContext = true 
} 

Objective-C

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.definesPresentationContext = YES; 
} 
30

Ho ricerca per ore e il mio risultato finale è stato quello di mettere questa linea in viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;

Problema risolto :)

+0

SI !! Grazie –

+0

questo mi ha davvero aiutato anche se ho avuto un problema diverso! Il mio problema era che non riuscivo a controllare il colore di sfondo della barra di stato quando la barra di ricerca era attiva. Grazie – Sid

+0

Grazie mille –

2

ho UISearchBar e UISearchDisplayController.

In viewDidLoad:

self.edgesForExtendedLayout = UIRectEdgeNone; 
searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault]; 

metodo che ottiene un'immagine da UIColor:

- (UIImage *)imageWithColor:(UIColor *)color 
{ 
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
0

Nel mio caso io non voglio nascondere l'UINavigationBar ma ho avuto problemi simili con a bocca aperta e dall'altro lato effetti. Uno di questi era UISearchBar mancante dopo il passaggio tra UIViewControllers mentre UISearchDisplayController è visibile (sto usando SWRevealViewController per passare da UIViewController). Questo problema si verifica solo su iPad. È venuto fuori che la UISearchBar si nasconde improvvisamente dietro la UINavigationBar. Ora ho risolto tutti i miei problemi con le seguenti righe di codice nel UITableViewController che viene presentato in un UIContainerView:

- (UINavigationController *)navigationController { 
    return nil; 
} 

Quelle linee prevenire l'UISearchDisplayController da raggiungere e cambiare la mia UINavigationController. Ho anche sottoclassato questo metodo nella classe "MyContainerTableViewController" e ora uso questa classe per tutto il controllo integrato di UITableView.

sto ancora utilizzando UISearchDisplayController per supportare iOS 7.

3

Ecco cosa ha funzionato per me:

DO:

  • Usa UISearchController (non un UISearchBar posto a parte)
  • Luogo il tuo VC in un UINavigationController, se non lo è già. Imposta il nav su "Mostra barra di navigazione" se lo desideri.
  • Utilizzare l'autolayout per UITableView (non molle e montanti) e fissare la parte superiore del tavolo alla parte superiore della vista del VC.
  • Aggiungere questo metodo delegato:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

NON FARE:

  • Fiddle con edgesForExtendedLayout
  • Fiddle con extendedLayoutIncludesOpaqueBars
  • Fiddle con della tabella contentInset
0

Il seguente trucco ha funzionato per me:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    return (self.searchController.isActive && section == 0) ? 22.0f : 0.0f; 
}