2014-04-16 10 views
10

Voglio avere uno UINavigationBar nella parte superiore della mia app, come nell'app del telefono, ad esempio, ma non voglio usarlo con uno UINavigationController, cioè, voglio usarlo come un oggetto "autonomo".UINavigationBar senza UINavigationController

Il controller di vista che avrà il UINavigationBar ha la sua vista in un file .xib. Ho provato a trascinare un'istanza di UINavigationBar dalla libreria di oggetti e funziona correttamente, ma la barra di stato dell'app è ancora bianca mentre lo UINavigationBar è grigio. Voglio che la barra di stato abbia lo stesso tono di grigio, ma non il resto della vista.

Per mostrarti cosa intendo, ho due foto. Il primo è l'app del telefono. Si noti che la barra di stato e la barra di navigazione sono grigie, ma lo sfondo è bianco.

iPhone Phone App

La seguente immagine è dalla mia app, come si può vedere la barra di stato è di colore bianco (io voglio che sia grigia pure).

My iPhone app

Ho anche cercato di utilizzare il seguente codice nel controller della vista.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationItem.title = @"Köp ProViva"; 
} 

ho provato sia con che senza la UINavigationBar ma o senza barra di navigazione si presenta o sembra la stessa di prima.

Come posso aggiungere una UINavigationBar e la barra di stato ha lo stesso colore?

+0

"la barra di stato dell'app è ancora bianca mentre UINavigationBar è grigia". Per favore spiega come il 'UINavigationBar' è grigio. Mi sembra bianco (con testo nero) – staticVoidMan

+0

@staticVoidMan Penso che sembri grigio, ma è un grigio molto chiaro: D –

+0

hm ... davvero super leggero. quindi ... vuoi il colore di sfondo di statusBar e navigationBar come lightGray? – staticVoidMan

risposta

16

È possibile implementare il metodo delegato -positionForBar: del protocollo UINavigationBarDelegate e semplicemente tornare UIBarPositionTopAttached.

Esempio:

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

//if you're not using a `UINavigationController` and instead 
//simply want a `UINavigationBar` then use the following method as well 
-(void)testMethod 
{ 
    UINavigationBar *navBar = [[UINavigationBar alloc] init]; 
    [navBar setFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)]; 
    [navBar setBarTintColor:[UIColor lightGrayColor]]; 
    [navBar setDelegate:self]; 
    [self.view addSubview:navBar]; 
} 

Spero che questo aiuti.

+0

Questo è attraverso il codice. Ma è possibile dal generatore di interfaccia stesso. Come nel generatore di interfacce, se trascino una UINavigationBar non riesco a modificare l'altezza. Nel controller ho UIBarPositionTopAttached. – andyPaul

+0

Sì. Basta impostare il controller come delegato della barra di navigazione come menzionato sopra. – TangZijian

2

// Creazione della pianura barra di navigazione

UINavigationBar *headerView = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
headerView.topItem.title = @"title"; 
[self.view addSubview:headerView]; 
+0

Come cambio il titolo di esso? –

+0

controlla la mia risposta modificata – Rushabh

+0

Sono stato in grado di aggiungere il 'UINavigationBar' (e sembra che io voglia) ma se cambio il titolo (usando la seconda riga di codice) non funziona per me. –

0

Non possiamo impostare il colore della barra di stato a nostra scelta, ciò che possiamo fare è;

Nel file AppDelegate.m;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
     //Set status bar style here 
     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

} 
1

Non è possibile modificare il colore di sfondo barra di stato direttamente, ma dal momento che è trasparente (dal iOS7), è possibile inserire un UIView di 20px in altezza dietro la barra di stato con il colore desiderato e sarà appare come se la barra di stato avesse un colore di sfondo.

Per quanto riguarda lo UINavigationBar, è sufficiente modificare un oggetto UINavigationBar che sarà di aiuto.

Esempio:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //... 

    //ISSUE 1: StatusBar Background 
    UIView *vwStatusBarUnderlay = [[UIView alloc] init]; 
    [vwStatusBarUnderlay setFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)]; 
    [vwStatusBarUnderlay setBackgroundColor:[UIColor lightGrayColor]]; 
    [self.view addSubview:vwStatusBarUnderlay]; 
    //[vwStatusBarUnderlay sendSubviewToBack:self.view]; 

    //ISSUE 2: NavigationBar 
    UINavigationBar *navBar = [[UINavigationBar alloc] init]; 
    [navBar setFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)]; 
    [navBar setBarTintColor:[UIColor lightGrayColor]]; 
    [navBar setTranslucent:NO]; 

    UINavigationItem *navItem = [[UINavigationItem alloc] init]; 
    [navItem setTitle:@"Favoriter"]; 
    [navItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil]]; 

    [navBar setItems:@[navItem]]; 
    [self.view addSubview:navBar]; 
} 
1

Prima risposta ha funzionato bene per me, ma qui è a Swift invece di Objective-C:

1- si imposta il delegato della barra di navigazione alla viewcontroller, sia attraverso storyboard o il codice.
2- aggiungere UINavigationBarDelegate ai vostri protocolli del regolatore o estenderlo come segue:

extension ViewController: UINavigationBarDelegate { 
    func positionForBar(bar: UIBarPositioning) -> UIBarPosition { 
     return UIBarPosition.TopAttached 
    } 
} 

Questo è tutto, funziona perfettamente!

Problemi correlati