2011-02-03 4 views
3

J'ai une application avec 4 onglets. Chaque onglet est un UINavigationController. Les 4 onglets UINavigationBar doivent être identiques, avoir une image d'arrière-plan personnalisée, un backButton personnalisé et un bouton droit personnalisé déclenchant une fonction.Boutons personnalisés UINavigationBar iPhone

Je voudrais faire ces personnalisations une seule fois dans mon code et non dans chaque RootViewController.

je réussi à avoir une image d'arrière-plan personnalisé en insérant ce code dans mon appDelegate:

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

Mais je ne suis pas parvenu à personnaliser les boutons arrière et droite ou spécifier l'action du bouton droit.

Existe-t-il un moyen de le faire dans appDelegate, tout comme pour l'image d'arrière-plan?
Ou devrais-je faire la personnalisation dans chaque RootViewController?

Répondre

13

Recopiez le code ci-dessous dans viewWillAppear méthode

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *butImage = [[UIImage imageNamed:@"back.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:10]; 
[button setBackgroundImage:butImage forState:UIControlStateNormal]; 
[button addTarget:self action:@selector(gotoBack:) forControlEvents:UIControlEventTouchUpInside]; 
button.frame = CGRectMake(0, 0, 48, 30); 
UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; 
self.navigationItem.leftBarButtonItem = backButton; 

et écrire l'événement d'action pour backButton.

-(IBAction)gotoBack:(id)sender 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

Articles Merci, mais je dois écrire ce code dans chaque RootViewController (pour chaque NavigationController). Ce que je veux, c'est pouvoir écrire le code une seule fois pour tous les NavigationControllers, comme je l'ai fait pour l'image de fond avec la catégorie dans mon appDelegate. –

+0

Dans ce cas, créez un objet qui encapsule cette méthode ci-dessus et appelez-le dans chaque classe applicable. Vous pouvez transmettre l'image, le sélecteur et le cadre du bouton en tant que paramètres. – user298261

1

La réponse de Renungas fonctionne correctement.

Si vous ne voulez pas écrire le même code 4 fois, vous pouvez toujours sous-classer UINavigationController.

Je viens d'essayer cette solution (avec sous-classe UITabBarController mais néanmoins ...) et ça marche bien.

Vous pouvez trouver similaire exemple here

Votre code personnalisé (identique à l'exemple mentionné) devrait ressembler à ceci:

- (void)loadView { 

     [super loadView]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [button setImage:[UIImage imageNamed:@"backbutton.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; 
     [button setFrame:CGRectMake(0, 0, 32, 32)]; 
     self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

    } 

    - (void)backAction { 

     [self.navigationController popViewControllerAnimated:YES]; 
    } 

Comme vous pouvez le voir tout ce que vous devez faire est de remplacer loadview et ajouter une méthode pour exécuter le sélecteur popVievController.

Bonne chance!

3

Dans votre appdelegate dans aplicationDidFinishLaunching .....

UIImage *navBG = [UIImage imageNamed:@"barra-logo-centro.png"]; 

[[UINavigationBar appearance] setBackgroundImage:navBG forBarMetrics:UIBarMetricsDefault]; 

//backbutton: 22x30 , [email protected] 

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

[[UIBarButtonItem appearance] setBackgroundImage:[UIImage imageNamed:@"normal_button.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

ce modifiera les navigationbar complets de proyect et bouton bar

Questions connexes