2010-02-14 19 views
11

Eventuali duplicati:
How to add background image on iphone Navigation bar?iPhone - NavigationBar Sfondo personalizzato

Sto cercando un modo per avere una barra di navigazione personalizzata e la necessità di avere una barra di navigazione di fondo per raggiungere questo obiettivo . Stavo cercando in giro come farlo, ma non sono riuscito a trovare una soluzione. Se qualcuno ha la soluzione, l'aiuto è molto apprezzato.

+0

C'è più soluzioni soluzioni alternative qui: http://stackoverflow.com/questions/1692487/how-to-add-background-image-on-iphone-navigation-bar –

risposta

6

È possibile aggiungere una sottoview (a UIImageView) a navaigationBar, che è solo una sottoclasse UIView.

UINavigationBar nb = [[UINavigationBar alloc]init]; 
[nb addSubview: foo]; 
[nb release]; 

Ecco un post sul forum che descrive come avvolgere questo in su in una categoria: http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

10

(supplementare alla risposta di Andrew Johnson)

Il post Apple.com collegato dispone di 3 o 4 diverse soluzioni , la maggior parte dei quali solo "metà" funziona. Credo che il più elegante/efficacia di loro è questa:

@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 
@end 

TUTTAVIA ... non è buona prassi objC a od che come categoria (dovrebbe essere un override), ed ha alcuni problemi del suo proprio.

Quindi, una soluzione più generale e potente è qui:

http://samsoff.es/posts/customize-uikit-with-method-swizzling

+0

Grazie per il collegamento per me Adam :) Hai ragione che i metodi prevalenti con le categorie sono una pessima pratica. –

+0

Qualcuno ha downvoted questo senza spiegazione? Non so perché. Anche se aggiungo: tutta questa domanda (e la maggior parte delle risposte) sono solo per iOS 2/3/4 - iOS 5 ha un sistema completamente nuovo per farlo. La risposta funziona ancora per le persone che stanno facendo iOS4. – Adam

14

Dal iOS5, si può facilmente impostare uno sfondo personalizzato, con il metodo setBackgroundImage: forBarMetrics: Ma è necessario verificare se il telefono dell'utente ha il sistema operativo corretto.

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) 
{ 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"] 
                forBarMetrics:UIBarMetricsDefault]; 
} 

Questa è una soluzione migliore, perché è nel documento.

+0

Fino a quando un utente che non esegue iOS5 esegue la tua app – JoeCortopassi

+3

Sì, ma c'è un controllo per quello. Puoi fare qualcos'altro nella clausola else. – Martin

3

Copia questo in viewDidLoad. Controllerà per iOS 5 e utilizzerà il metodo preferito, altrimenti aggiungerà una sottoview al navBar per le versioni iOS < 5.0. Questo funzionerà a condizione che l'immagine di sfondo personalizzata non abbia lucidi.

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
NSLog(@"%f",version); 
UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"]; 
if (version >= 5.0) { 
    [self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; 
} 
else 
{ 
    [self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1]; 
} 
Problemi correlati