31

Vorrei un'immagine per occupare tutta la barra di navigazione. Questa è la navigazione che viene fornita con un'app di navigazione. Appare sul RootViewController con l'UITableView che accompagna. Ho visto alcuni esempi di come questo potrebbe funzionare.Aggiunta immagine alla barra di navigazione

Imposta il titolo della barra di navigazione:

UIImage *image = [UIImage imageNamed:@"TableviewCellLightBlue.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
[self.navigationController.navigationBar.topItem setTitleView:imageView]; 

Il problema c'è copre solo il titolo piuttosto che l'intera barra di navigazione.

C'è anche questa discussione: http://discussions.apple.com/message.jspa?messageID=9254241#9254241. Verso la fine, la soluzione sembra utilizzare una barra delle schede, che non sto utilizzando. È così complicato impostare uno sfondo della barra di navigazione? C'è qualche altra tecnica più semplice?

Mi piacerebbe avere uno sfondo per la navigazione ed essere ancora in grado di utilizzare il testo del titolo.

risposta

36

Nel tuo caso, this solution found in another answer funzionerebbe bene.

Con la categoria "CustomImage" aggiunto al UINavigationBar, si può poi basta chiamare:

UINavigationBar *navBar = self.navigationController.navigationBar; 
UIImage *image = [UIImage imageNamed:@"yourNavBarBackground.png"]; 
[navBar setBackgroundImage:image]; 

Questo codice dovrebbe andare nel metodo

- (void)viewWillAppear:(BOOL)animated 

del controller della vista in cui si desidera avere l'immagine personalizzata. E, in questo caso si dovrebbe meglio chiamare:

[navBar clearBackgroundImage]; // Clear any previously added background image 

prima setBackgroundImage (in caso contrario verrà aggiunto più volte ...)

+0

Perfetto. Grazie. Inoltre, sai come posso impostare il colore della barra del titolo? Ho provato questo, ma non funziona: [self.navigationController.navigationBar.titleView setBackgroundColor: [UIColor blueColor]]; – 4thSpace

+0

Ho provato anche [navBar setBackgroundColor: [UIColor blueColor]]; – 4thSpace

+0

C'è la proprietà tintColor: prova navBar.tintColor = [UIColor blueColor]; –

8

v'è in realtà un modo molto più semplice per aggiungere un'immagine di sfondo per qualsiasi UIView classe o sottoclasse. Non richiede alcuna categorizzazione di classe o estensione (sottoclasse), e puoi farlo su una base "come necessario". Ad esempio, per aggiungere un'immagine di sfondo alla barra di navigazione di un controller della vista, procedere come segue:

self.navigationController.navigationBar.layer.contents = (id)[UIImage 
    imageNamed:@"background.png"].CGImage; 

sarà necessario ricordarsi di aggiungere il quadro Quartz Nucleo al progetto e aggiungere #import <QuartzCore/QuartzCore.h> ovunque è necessario fare questo . Questo è un modo molto più semplice e più semplice per alterare il livello di disegno di tutto ciò che eredita da UIView. Ovviamente, se si desidera ottenere un effetto simile per tutte le barre di navigazione o le barre di tabulazione, allora la sottoclasse ha senso.

9
UIImage *image = [UIImage imageNamed:@"YourImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

[self.navigationController.navigationBar addSubview:imageView]; 
3

ho usato soluzione cmp s' e ha aggiunto un po' di logica per rimuoverlo come volevo solo un'immagine di sfondo personalizzata sulla schermata iniziale all'interno a vista apparire.

HomeViewController.m

UIImage *image = [UIImage imageNamed:@"HomeTitleBG.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
imageView.tag = 10; 

UIImageView *testImgView = (UIImageView *)[self.navigationController.navigationBar viewWithTag:10]; 

if (testImgView != nil) 
{ 
    NSLog(@"%s yes there is a bg image so remove it then add it so it doesn't double it", __FUNCTION__); 
    [testImgView removeFromSuperview]; 

} else { 
    NSLog(@"%s no there isn't a bg image so add it ", __FUNCTION__); 
} 

[self.navigationController.navigationBar addSubview:imageView]; 


[imageView release]; 

Ho anche provato ad utilizzare il metodo clearBackgroundImage suggerito, ma non sono riuscito a farlo funzionare così ho dato l'immagine di un tag e poi rimosso negli altri viewcontrollers in mostra appariranno .

OtherViewController.m

UIImageView *testImgView = (UIImageView *)[self.navigationController.navigationBar viewWithTag:10]; 

if (testImgView != nil) 
{ 
    NSLog(@"%s yes there is a bg image so remove it", __FUNCTION__); 
    [testImgView removeFromSuperview]; 
} 

`

4
UIImage *logo = [UIImage imageNamed:@"my_logo"]; 
UIImageView *logoView = [[UIImageView alloc]initWithImage:logo]; 
logoView.frame = CGRectMake(0, 0, 320, 37); 

UINavigationController *searchNavCtrl = [[UINavigationController alloc] initWithRootViewController:searchViewController]; 
searchNavCtrl.navigationBar.barStyle = UIBarStyleBlack; 


//searchNavCtrl.navigationItem.titleView = logoView; 
//[searchNavCtrl.navigationController.navigationBar.topItem setTitleView:logoView]; 
[searchNavCtrl.navigationBar addSubview:logoView]; 

[logoView release]; 
23

sua cambiate per iOS6, per farlo funzionare in iOS 6 uso:

UINavigationBar *navBar = self.navigationController.navigationBar; 
UIImage *image = [UIImage imageNamed:@"image.png"]; 
[navBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
4

Basta aggiungere questa linea.

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar.png"] forBarMetrics:UIBarMetricsDefault]; 

Bam! Una linea e fatta.

+2

lol jk questa b una delle migliori risposte che ho visto nella mia vita! – GangstaGraham

0

basta andare il controller della vista e incollare nel super-viewDidLoad e sostituire l'immagine in mainlogo e quindi impostare il titolo di navigazione nel impostare il logo immagine

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //set your image frame 
    UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0,0,70,45)] ; 

    //set your image logo replace to the main-logo 
    [image setImage:[UIImage imageNamed:@"main-logo"]]; 

    [self.navigationController.navigationBar.topItem setTitleView:image]; 

} 
+2

Come migliora qui altre risposte? – Mark

+0

@ yogesh Sai la risposta, ma penso che il codice sia carino con alcuni commenti/passaggi. –

+0

@Mark puoi aggiungerlo in super viewloadload e –

0

Aggiungere codice in AppDelegate ha terminato con metodo

lancio
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0) 
{ 
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigation_or.png"] forBarMetrics:UIBarMetricsDefault]; 
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault]; 
} 
else 
{ 
    [[UINavigationBar appearance] setBarTintColor:UIColorFromRGB(0x067AB5)]; 

    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; 

    // Uncomment to assign a custom backgroung image 
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigation_or.png"] forBarMetrics:UIBarMetricsDefault]; 

    // Uncomment to change the back indicator image 
    [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; 

    [[UINavigationBar appearance] setBackgroundColor:[UIColor whiteColor]]; 
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@""]]; 

    // Uncomment to change the font style of the title 

    NSShadow *shadow = [[NSShadow alloc] init]; 
    shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; 
    shadow.shadowOffset = CGSizeMake(0, 0); 

    [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,shadow, NSShadowAttributeName,[UIFont fontWithName:@"HelveticaNeue-Bold" size:17], NSFontAttributeName, nil]]; 

    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault]; 
}