2010-07-14 10 views
16

J'ai une application iPhone en utilisant UINavigationController et j'aimerais personnaliser les éléments avec des images de fond personnalisées. J'ai pu le faire pour la UINavigationController'sUINavigationBar assez facilement en utilisant les catégories Objective-C comme ci-dessous:Personnalisé UINavigationController UIToolbar Image d'arrière-plan

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

Je voudrais faire la même chose pour la UINavigationController'sUIToolbar, mais la même approche ne semble pas pour travailler (bien que je ne sache absolument pas pourquoi.) J'ai regardé autour et les gens semblent suggérer sous-classement UIToolbar, mais ce n'est pas possible pour la barre d'outils UINavigationController's, qui est un UIToolbar en lecture seule. Je souhaite utiliser la barre d'outils UINavigationController's au lieu de simplement créer une barre d'outils de sous-vue car j'utilise l'animation setToolbarHidden sous forme de diapositive. Tout le monde sait s'il est possible d'appliquer une image d'arrière-plan à cette barre d'outils UINavigationController (probablement en remplaçant d'une manière ou d'une autre la méthode drawRect)?

Répondre

9

Vous devez sous-classer au lieu de créer une catégorie. Je ne sais pas pourquoi une catégorie fonctionne pour UINavigationBar mais pas UIToolbar, mais le sous-classement fonctionne pour les deux et je pense que c'est la façon la plus standard de personnaliser les choses comme ça.

donc à sous-classe UIToolbar, créer une classe appelée MyToolbar (ou quelque chose de similaire) et de mettre cela dans le .h:

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

@interface MyToolbar : UIToolbar {} 

- (void)drawRect:(CGRect)rect; 

@end 

Et ceci dans le fichier .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 

De là, vous devez indiquer au contrôleur de navigation d'utiliser MyToolbar au lieu de UIToolbar. La manière la plus facile que j'ai trouvé de faire est de sélectionner votre contrôleur de navigation dans Interface Builder, puis dans l'inspecteur d'attributs, cochez la case "Barre d'outils". La barre d'outils doit apparaître dans la fenêtre NavigationController. Cliquez dessus, puis dans l'inspecteur d'identité, changez la classe en MyToolbar.

+3

Parfait! Merci. Connaissez-vous (ou quelqu'un d'autre) un moyen de faire la dernière étape par programmation? Je n'ai pas configuré mon contrôleur de navigation avec Interface Builder. – Chris

+2

@Chris, je voudrais également savoir comment remplacer la barre d'outils par programmation. Merci! – pixelfreak

+1

Quelqu'un a trouvé comment la dernière étape peut être faite par programme? – Panos

10

Mise à jour:

Dans iOS 5.0+, vous pouvez maintenant utiliser UIAppearance pour personnaliser la barre de navigation.


Une autre façon de le faire est de simplement créer une catégorie pour la classe de votre application UINavigationBar. Cela a été assez simple à mettre en œuvre:

Interface:

@interface UINavigationBar (TENavigationBar) 

- (void) drawRect:(CGRect)rect; 

@end 

Mise en œuvre:

@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 

alors ce sera globalement appliquée à tous automatiquement de votre UINavigationBar.

+1

Malheureusement, cela personnalise la barre de navigation et PAS la barre d'outils. –

+0

Wow, bon point. J'ai complètement raté la marque sur celui-ci. Encore une bonne solution pour la barre de navigation. :) – Maurizio

+0

J'ai ajouté deux fichiers à mon code, UINavigationBar.h et UINavigationBar.m et leur ai ajouté ce code. J'ai également essayé avec les noms de fichiers JHNavigationBar.h/.m. Ce n'était pas automatiquement appliqué pour moi. Qu'est-ce que je rate? – joshholat

2

L'une des meilleures solutions consiste à créer une catégorie de UINavigationBar et UIToolbar. Les classes suivantes vous donne une solution pour iOS 4.0 et la compatibilité iOS 5.0:

La seule chose est que vous devez appeler les méthodes suivantes dans votre viewDidLoad par exemple:

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

Ainsi, la catégorie de classe pour iOS Compatibilité 4.0 et iOS 5.0 pour personnaliser les résultats BackgroundImage comme suit:

@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 

Greets!

0

Une option simple est de sous-classe UINavigationBar/UIToolbar et initialiser le contrôleur de navigation à l'aide de la méthode:

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

Cependant, pour les personnalisations simples (comme les images de fond, des ombres, etc.) Je recommande à utilisez le modèle de protocole UIAppearance.