web-dev-qa-db-fra.com

Modification de l'image d'arrière-plan UINavigationBar

J'ai essayé de changer l'image d'arrière-plan de la barre UINavigation de mon application. J'ai essayé plusieurs façons. J'ai d'abord ajouté à ma classe AppDelegate le code suivant:

@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

Mais ça ne marchait pas. Mon essai suivant consistait à écrire une classe CustomizedNavigationBar qui substitue la méthode drawRect. Cela ressemblait à ça:

CustomizedNavigationBar.h

#import <UIKit/UIKit.h>

@interface CustomizedNavigationBar : UINavigationBar

@end

CustomizedNavigationBar.m

#import "CustomizedNavigationBar.h"

@implementation CustomizedNavigationBar

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

    NSLog(@"I got called!!!!!");
}

@end

Dans mon fichier .xib où la NavigationBar est définie, j'ai remplacé la classe par la nouvelle CustomizedNavigationBar. Mais ça ne marche toujours pas ..

Comme autre test, j'ai téléchargé un exemple de projet dans lequel l'image de fond devrait être modifiée. Mais même avec cet exemple de code, cela ne fonctionnait pas. 

Qu'est-ce que je fais mal? J'utilise IOS 5. Avez-vous des suggestions ou d'autres moyens de définir une image d'arrière-plan?

Merci pour vos réponses!

22
Prine

À partir de iOS 5, vous devez utiliser la méthode -setBackgroundImage:forBarMetrics: :

[myNavbar setBackgroundImage:[UIImage imageNamed: @"UINavigationBarBackground.png"] 
               forBarMetrics:UIBarMetricsDefault];

Et dans Swift 4:

navigationBar.setBackgroundImage(UIImage(named: "UINavigationBarBackground.png"),
               for: .default)
77
Craz

Compte tenu de toutes les versions d'iOS, cela semble permettre à la fois une image d'arrière-plan personnalisée et une taille personnalisée de UINavigationBar:

@interface CustomNavigationBar : UINavigationBar
@end

@implementation CustomNavigationBar
-(void) drawRect:(CGRect)rect 
{
    UIImage *image = [UIImage imageNamed: @"navigationBar"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

    //for iOS5
    [self setBackgroundImage:[UIImage imageNamed: @"navigationBar"] forBarMetrics:UIBarMetricsDefault];
}

//for custom size of the UINavigationBar
- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(320,31);
    return newSize;
}

@end

J'utilise ces codes dans un endroit commun, comme un fichier Utilities.

J'espère que cela t'aides.

8
theunexpected1

Essayez simplement avec ce code .. Dans votre fichier d'implémentation (.m).

#import "RootViewController.h"

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

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    self.title=@"You are Done.";
}

Cela a fonctionné de manière excellente pour moi.

Code ci-dessus Fonctionne uniquement pour IOS 4. Si vous utilisez le IOS 5, utilisez .....

 [myNavbar setBackgroundImage:[UIImage imageNamed:
 @"UINavigationBarBackground.png"] 
                    forBarMetrics:UIBarMetricsDefault];
1
Ajay Sharma

Eh bien pour iOS 4, il existe une solution simple, comme:

nvc.navigationBar.layer.contents = (id)img.CGImage;
0
Pavel Sich

Vous pouvez également essayer ceci pour le fond de la barre de navigation.

UINavigationBar *navigationBar = self.navigationController.navigationBar;
UIImage *image = [UIImage imageNamed: @"NavBar-Wood.png"];
[navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault];
self.navigationController.navigationBar.tintColor = [UIColor brownColor];

Merci.

0
Gajendra K Chauhan

Une autre façon de définir une image dans la barre de navigation est, 

UIImage* logo = [ UIImage imageNamed:@"Logo.png" ];
UIImageView* logoView = [[[UIImageView alloc] initWithImage:logo] autorelease];
self.navigationItem.titleView = logoView;

Cela ne changera pas tout l'arrière-plan de la barre de navigation. Mais ajoute une image d’arrière-plan centrée sur la barre de navigation, ce qui est parfois plus voulu (ce que je cherchais). 

0
karim

Vous pouvez ajouter UIImageview à la barre de navigation comme suit UINavigationBar navBar = [[UINavigationBar alloc] init]; [navBar addSubview: imageview]; [version de navBar];

Vous pouvez consulter la publication: iPhone - NavigationBar Custom Background

0
Minakshi