2013-09-24 13 views
17

I (proprio come tutti gli altri qui) sto correndo nella stessa barra di stato problema di sovrapposizione che tutti gli altri sono, con una piccola svolta, ed è per questo che apro una nuova domanda su questo.UISearchBar si sovrappone alla barra di stato in iOS

Sembra esserci un meccanismo che consente a UISearchBar di sapere dove posizionarsi, che è totalmente da fuori whack.

jaredsinclair answer here (iOS 7 status bar back to iOS 6 default style in iPhone app?), spiega in modo dettagliato come gli ingegneri Apple ci permettono di introdurre la logica della nostra applicazione al fine di integrarsi il più possibile con l'ambiente dell'utente.

Ho esaminato attentamente ogni UIViewController nella mia applicazione e ho apportato la minima modifica possibile.

Nella maggior parte dei casi sono stato in grado di risolvere il problema usando il codice seguente che ho trovato dall'altra parte più risposte SO

// Do any additional setup after loading the view. 
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){ 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

Questo però non avrebbe funzionato, non importa quello che faccio in una particolare vista in cui l'UINavigationBar è nascosto.

UISearchBar on top of status bar

Sulla base della soluzione trovata in così ho potuto risolvere questo problema aggiungendo il seguente pezzo di logica per questo particolare UIViewController

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { 
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
    viewFrame.origin.y = viewFrame.origin.y+statusBarFrame.size.height; 
} 

Ciò spinge l'UIViewController n pixel giù "dipendente" dall'altezza della barra di stato.

L'effetto di questo è mostrare qui

Hacked position UISearchBar

Il problema è che quando entro il campo di ricerca l'UISearchBar aggiunge di per sé un'imbottitura 20px sulla parte superiore, che compensa l'intera interfaccia utente.

enter image description here

Questo mi porta alla conclusione che l'UISearchBar cerca di adattarsi, e per coincidenza che si adatti in sé lo stesso importo esatto come l'altezza della barra di stato.

Se non eseguo l'hacking della posizione, una volta inserito il campo di ricerca, questa regolazione automatica allinea ordinatamente UISearchBar sotto la barra di stato.

Spero di aver dettagliato la mia confusione, mi chiedo se qualcuno abbia qualche idea per una soluzione.

+0

Qualche fortuna su questo problema? Sto avendo lo stesso identico problema. Ho notato nei tuoi screenshot che stai usando una sorta di Slide Out Nav. Controller. Lo sono anch'io, forse è parte del problema? – Chilly

+0

Ciao purtroppo, purtroppo nessuna soluzione, ma la prossima settimana inizieremo un'altra iterazione dell'interfaccia utente e cercherò di approfondire questo problema, poiché al momento siamo rilasciati con quella seccatura, ti terrò posto –

risposta

27

Se il navigationBar è visibile effettuare le seguenti operazioni in viewDidLoad:

self.edgesForExtendedLayout = UIRectEdgeNone; 

Se il navigationBar è nascosto eseguire quanto segue viewDidLoad:

regolare tutti gli elementi UIView spostando loro 20pt

+0

Spot on. Se si utilizza Interface Builder, è possibile utilizzare i delta iOS6/7: in primo luogo, "visualizza come iOS 6.0", quindi impostare un delta di "20" per ottenere l'offset +20 in iOS 7 (è necessario impostare su tutte le visualizzazioni che richiedono giù). –

+0

La mia barra di ricerca è nascosta e inserisco un interruttore nella barra di navigazione. In iOS 6 ha funzionato bene, e ora funziona bene su iOS con l'impostazione self.edgesforExtendedLayout. Grazie! – Ismael

+0

Ti prego, aiutami a spostare tutti gli elementi di UIView – Anees

4

Anche questo problema è stato risolto. È necessario inserirlo nel metodo viewDidLoad ViewControllers.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

Questo dovrebbe risolvere il problema. È indicato anche nella Guida alla transizione di iOS 7. https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

+0

Grazie Ben, se hai letto la mia domanda, l'ho già provato. E anche se ha funzionato, non risolve l'auto-regolazione di UISearchBar di 20px –

+0

Mi dispiace che non potrei aiutarti. Comunque nella mia app ha funzionato e quando ho impostato i bordi per EstesoLayout il campo del campo di ricerca rimane come era quando non è attivo. No offset 20px. –

0

Non sono molto chiaro sul bit della barra di ricerca che regola la sua altezza - le mie barre di ricerca non lo fanno? Ma.

È possibile aggiungere un vincolo alla Guida al layout principale in IB, per la barra di ricerca. Questo farà sì che si attacchi alla parte inferiore della barra di stato in entrambi ios 6 e ios 7. Se si rimuove il codice in cui si modifica manualmente l'altezza della barra di stato. Questo dovrebbe prendersene cura. Puoi vedere un esempio di come farlo qui: https://developer.apple.com/library/ios/qa/qa1797/_index.html

4

UISearchBar ha un metodo delegato per quello che vuoi. Basta posizionarlo a 20px dall'alto.

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

Sfortunatamente non funziona insieme a un UISearchDisplayController.

2

Ho ottenuto lo stesso identico problema e sulla base di suggerimenti come @ Ben's e here ho finito per aggiungere il seguente codice che mi ha aiutato:

- (void) viewDidLayoutSubviews 

    { 
     if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
     { 
      CGRect viewBounds = self.view.bounds; 
      CGFloat topBarOffset = self.topLayoutGuide.length; 
      viewBounds.origin.y = topBarOffset * -1; 
      self.view.bounds = viewBounds; 

      self.edgesForExtendedLayout = UIRectEdgeNone; 
     } 
    } 

in alternativa questo codice funziona anche

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 

     self.automaticallyAdjustsScrollViewInsets=YES; 
     self.edgesForExtendedLayout = UIRectEdgeNone; 
     self.navigationController.view.backgroundColor = [UIColor whiteColor]; 
     self.navigationController.navigationBar.translucent = YES; 
    } 
+0

Dove hai inserito questo codice esattamente? –

+0

L'ho messo nella classe di implementazione del visualizzatore di tabelle, spero che sia utile. – malkoty

2

Se qualcuno vuole risolvere questo problema tramite layout automatico, invece di aggiungere un vincolo searchBar.top = self.view.top aggiungere un vincolo alla topLayoutGuide, in questo modo:

searchBar.top = topLayoutGuide.bottom 
Problemi correlati