2010-07-14 12 views
16

Ho un'applicazione per iPhone che utilizza UINavigationController e desidero personalizzare gli elementi con immagini di sfondo personalizzate. Sono stato in grado di fare questo per il UINavigationController'sUINavigationBar abbastanza facilmente usando categorie Objective-C, come di seguito:UINavigationController personalizzato UIToolbar Immagine di sfondo

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

mi piacerebbe fare lo stesso per la UINavigationController'sUIToolbar, ma lo stesso approccio non sembra lavoro (anche se non ho assolutamente idea del perché no.) Mi sono guardato intorno e la gente sembra suggerire sottoclassi UIToolbar, ma questo non è possibile per la barra degli strumenti UINavigationController's, che è una lettura sola UIToolbar. Voglio utilizzare la barra degli strumenti UINavigationController's invece di creare una barra degli strumenti di visualizzazione secondaria perché sto utilizzando l'animazione diapositiva setToolbarHidden.

Qualcuno ha idea se è possibile applicare un'immagine di sfondo a questa barra degli strumenti UINavigationController (molto probabilmente in qualche modo sovrascrivendo il metodo drawRect)?

risposta

9

È necessario creare una sottoclasse anziché creare una categoria.

Non sono sicuro del perché una categoria funzioni per UINavigationBar ma non UIToolbar, ma la sottoclasse funziona per entrambi e penso che sia il modo più standard per personalizzare cose del genere.

Quindi, per sottoclasse UIToolbar, creare una classe chiamata MyToolbar (o qualcosa di simile) e mettere questo nel .h:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface MyToolbar : UIToolbar {} 

- (void)drawRect:(CGRect)rect; 

@end 

E questo nel file .m:

#import "MyToolbar.h" 

@implementation MyToolbar 

- (void)drawRect:(CGRect)rect { 
    backgroundImage = [UIImage imageNamed:@"my-awesome-toolbar-image.png"]; 
    [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 

Da lì devi dire al controller di navigazione di utilizzare MyToolbar anziché UIToolbar. Il modo più semplice che ho trovato è quello di selezionare il tuo controller di navigazione in Interface Builder, quindi nell'Inspector degli attributi selezionare la casella "Mostra barra degli strumenti". La barra degli strumenti dovrebbe apparire nella finestra NavigationController. Fare clic su di esso e quindi in Identity Inspector modificare la classe su MyToolbar.

+3

Ottimo! Grazie. Tu (o chiunque altro) sei a conoscenza di un modo per fare l'ultimo passo a livello di programmazione? Non ho il mio controller di navigazione configurato con Interface Builder. – Chris

+2

@Chris, mi piacerebbe anche sapere come sovrascrivere la barra degli strumenti a livello di programmazione. Grazie! – pixelfreak

+1

Qualcuno ha trovato come l'ultimo passo può essere fatto a livello di programmazione? – Panos

10

Aggiornamento:

in iOS 5.0 + è ora possibile utilizzare UIAppearance per personalizzare la barra di navigazione.


Un altro modo per farlo è quello di creare semplicemente una categoria per la classe dell'applicazione UINavigationBar. Questo è stato abbastanza semplice da implementare:

Interfaccia:

@interface UINavigationBar (TENavigationBar) 

- (void) drawRect:(CGRect)rect; 

@end 

Implementazione:

@implementation UINavigationBar (TENavigationBar) 

- (void) drawRect:(CGRect)rect 
{ 
    UIImage *image = [UIImage imageNamed:@"navigation_background"]; 

    [image drawInRect:CGRectMake(0, 
           0, 
           self.frame.size.width, 
           self.frame.size.height)]; 
} 

@end 

allora questo sarà globalmente applicato a 's tutti i vostri UINavigationBar automaticamente.

+1

Sfortunatamente questo personalizza la barra di navigazione e NON la barra degli strumenti. –

+0

Wow, buon punto. Ho totalmente perso il segno su questo. Comunque una buona soluzione per la barra di navigazione però :) – Maurizio

+0

Ho aggiunto due file al mio codice, UINavigationBar.h e UINavigationBar.m e ho aggiunto questo codice a loro. Ho anche provato con i nomi di file JHNavigationBar.h/.m. Non è stato automaticamente applicato per me. Cosa mi manca? – joshholat

2

Una delle migliori soluzioni è la creazione di una categoria di UINavigationBar e UIToolbar. Le prossime lezioni vi offre una soluzione per iOS 4.0 e iOS 5.0 compatibilità:

l'unica cosa è che devi chiamare i metodi tuoi prossimi viewDidLoad ad esempio:

// Customizacion de navigation bar y toolbar compatible con iOS4 e iOS5 
[UINavigationBar iOS5UINavigationBarBackgroundImage]; 
[UIToolbar iOS5UIToolbarBackgroundImage];  

Così, Categoria classe per iOS Compatibilità 4.0 e iOS 5.0 per personalizzare i risultati di BackgroundImage come segue:

@implementation UINavigationBar (BackgroundImage) 
- (void)drawRect:(CGRect)rect 
{  
    UIImage* img = [UIImage imageNamed: @"navigation-bg.png"]; 
    [img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    [self setTintColor:UIColorFromRGB(0x5ca666)];  
} 
+ (void) iOS5UINavigationBarBackgroundImage 
{ 
    if ([UINavigationBar respondsToSelector: @selector(appearance)]) 
    { 
     [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"navigation-bg.png"] forBarMetrics: UIBarMetricsDefault]; 
     [[UINavigationBar appearance] setTintColor:UIColorFromRGB(0x5ca666)]; 
    } 
} 
@end 

@implementation UIToolbar (BackgroundImage) 
- (void)drawRect:(CGRect)rect 
{ 
    UIImage *image = [UIImage imageNamed: @"toolbar-bg.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    [self setTintColor:UIColorFromRGB(0x5ca666)]; 
} 
+ (void) iOS5UIToolbarBackgroundImage 
{ 
    if ([UIToolbar respondsToSelector: @selector(appearance)]) 
    { 
     [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed: @"toolbar-bg.png"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault]; 
     [[UIToolbar appearance] setTintColor:UIColorFromRGB(0x5ca666)]; 
    } 
} 
@end 

Saluti!

0

Una soluzione semplice è quella di creare una sottoclasse UINavigationBar/UIToolbar e inizializzare il controller di navigazione utilizzando il metodo:

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass

Tuttavia, per semplici personalizzazioni (come immagini di sfondo, le ombre, ecc) mi sento di raccomandare a utilizzare il modello di protocollo UIAppearance.