2012-01-15 21 views
9

Questo aspetto era abbastanza semplice quando l'ho configurato, ma non posso spiegare perché questo spazio sia presente tra la barra di stato e la barra di navigazione. Inoltre, la vista contenuta sembra essere allineata correttamente, ed è solo la barra di navigazione che viene spostata verso il basso. Il divario sembra la dimensione della barra di stato, quindi mi aspetto che abbia qualcosa a che fare con esso, ma non so cosa.UINavigationController presenta una barra di stato aggiuntiva nella parte superiore

Nav Bar with extra space

Ecco il codice per impostare il controller di navigazione:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    advancedVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil]; 
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:advancedVC]; 
    nav.navigationBar.tintColor = [UIColor defaultNavBarTint]; 
    nav.navigationBar.topItem.title = NSLocalizedString(@"SearchTitle", nil); 
    UIBarButtonItem *searchButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"SearchButton", nil) style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];   
    nav.navigationBar.topItem.rightBarButtonItem = searchButton; 

    self.view = nav.view; 
} 

Il RootViewController utilizza una vista da un file XI ter, dove ho simulato la barra di stato, la barra di navigazione, e la barra delle schede.

+0

Si noti che questa è un'area in cui esistono differenze tra iOS 5 e versioni precedenti. Se si utilizza il layout "in scatola" per il controller di navigazione è abbastanza portatile, ma se lo si è personalizzato, le cose si spostano un po 'tra le due versioni. (Non ho mai capito bene cosa faccia la differenza, ma quello che stai mostrando è tipico per il codice di iOS 4 in esecuzione su iOS 5.) –

+0

vedi questa prima risposta di questa domanda http://stackoverflow.com/questions/5850705/why-do-navigation-appear-20-pixels-below-status-bar-in-the-view – CarmeloS

risposta

0

Il problema è stato risolto fissando il modo in cui il controller di navigazione è stato inserito. Invece di inserirlo in una vista che era stata inserita nel controller della barra delle linguette, il controller di navigazione avrebbe dovuto essere posizionato direttamente sul controller di navigazione.

advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil]; 
UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC]; 

Questo è solo un regolatore che è sul controller barra delle linguette, sostituendo l'advancedSearchFormVC allo stesso tempo. Quindi questo controller nav è stato aggiunto all'array di controller che è stato inserito nel controller della tabbar.

Siamo spiacenti per qualsiasi problema, ma questo era uno di quei problemi che posso guardare direttamente e non vederlo. Avrei dovuto vederlo prima, perché avevo già un altro controller nav sul controller tabbar, ed è stato impostato allo stesso modo.

Grazie per l'assistenza.

+2

Jim - Non sto seguendo esattamente la tua soluzione. Puoi pubblicare il codice per mostrare la correzione effettiva per favore? – DoctorG

0

Dal momento che si sta aggiungendo advancedVC come visualizzazione secondaria di self.view, si viene aggiunto all'interno del telaio di self.view che sto cercando di indovinare è già compensando la barra di stato.

probabilmente si può facilmente risolvere il problema con l'aggiunta di questa linea:

nav.view.frame = self.view.frame; 

Proprio sopra di questa linea:

self.view = nav.view; 

-

Altri pensieri

Sono non è al corrente dell'intera configurazione, ma self.view potrebbe non essere affatto necessario. È sufficiente creare l'istanza advancedVC dello rootViewController dell'istanza UIWindow contenuta nel delegato dell'app.

7

Ho avuto lo stesso problema prima. Il codice che ho usato per aggiungere UINavigationBar a UIViewController:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self]; 
[self.view addSubview:nc.view]; 

Soluzione:
Selezionare la casella "vuole Full Screen" con Attributi del vostro UIViewController.

10

Il problema è in effetti che il controller di navigazione si aspetta sempre di lasciare spazio per la barra di stato, che è il divario di 20 pixel.Ho cercato in giro per un po 'prima di trovare questa soluzione che funziona:

//nav is assumed to be a subclass or instance of UINavigationController 
nav.view.frame = CGRectOffset(nav.view.frame, 0.0, -20.0); 
//you can then add the navigation's view as a subview to something else 

Originariamente ho trovato una risposta che ha fatto questo offset al punto di vista della navigationbar, ma non ha funzionato. Funziona quando lo si fa alla vista reale dei controller di navigazione.

Io uso questa tecnica per aggiungere un controller di navigazione da un altro pennino a una vista vuota del mio pennino principale, così posso posizionarlo ovunque all'interno della schermata principale come una sottoview. Usando una vista vuota come un segnaposto e una cornice di posizionamento sul mio pennino principale, creo un pennino e una classe separati per gestire la navigazione, che gestisce altri pennini usati per gestire i loro schermi. In questo modo posso risolvere il classico "come aggiungo banner, immagini o viste personalizzate sopra il mio controller di navigazione" pur avendo un controller di navigazione come subview ... in iOS 5 per essere specifico.

Vale anche la pena ricordare che utilizzo il delegato dell'app per archiviare e accedere a tutti gli altri controller, quindi vengono conservati da un'istanza persistente a cui posso accedere da qualsiasi classe. Crea e sintetizza alcune proprietà nel delegato dell'app di tutti i tuoi controller e in viewDidLoad crea le istanze. In questo modo posso fare riferimento tutti i controller utilizzati nella mia app in seguito ovunque, aggiungendo:

//this shows how to store your navigation controllers in the app delegate 
//assumes you've added 2 properties (UINavigationController*)"navController" and (UIViewController*)"rootController" in your app delegate 
//...don't forget to add #import "AppDelegate.h" to the top of the file 

AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
[app.navController pushViewController: app.rootController animated:YES]; 
//now apply the offset trick to remove the status gap 
app.navController.view.frame = CGRectOffset(app.navController.view.frame, 0.0, -20.0); 
+0

hanno trovato la stessa soluzione, ma non ne sono felice ... – iWheelBuy

+0

@Ali grazie per la soluzione! davvero fantastico! – gaussblurinc

1

Come tutti sappiamo ormai, lo spostamento di 20 pixel è quello di fornire uno spazio per la barra di stato in alto. Tuttavia, il sistema di coordinate del controller della vista viene mantenuto in posizione e solo la cornice della barra di navigazione viene spostata di 20 pixel verso il basso. Ciò rende la barra di navigazione effettivamente sovrapposta ai 20 pixel superiori della vista.

Logging l'origine barre di navigazione fotogramma, mostrerà (0.0, 20.0)

Quindi la soluzione è quella di riposizionare semplicemente l'origine del barra di navigazione per (0.0, 0.0) in viewWillAppear.

self.navigationController.navigationBar.frame = CGRectMake(0.0, 0.0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height); 
7

Si può cercare di impostare l'attributo Sotto Migliore Barincontrollati da Attributi sezione del UIViewController.

+0

Questo ha funzionato per me, grazie. –

0

Il problema è che UINavigationController.view deve essere aggiunto alla vista superiore. Basta trovare quello in alto e funzionerà alla grande.

Problemi correlati