Question

J'ai réussi à ajouter un arrière-plan personnalisé à ma barre de navigation en utilisant:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

Cela fonctionne bien et je peux voir le titre et les boutons bien. Cependant, lorsque je descends dans un niveau puis que je retourne à la racine, les boutons sont masqués, mais le titre est toujours visible. Il semble que l’image de la barre de navigation couvre les éléments du bouton.

Je suis dérouté car je l'insère en bas. Je suppose donc que lorsque les éléments de navigation sont déplacés, ils apparaissent au-dessus des autres vues dans la barre de navigation.

Des idées?

Merci,

Mike

Était-ce utile?

La solution

Après la description de ici , je suggère d’ajouter une catégorie à la barre de navigation.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end

Autres conseils

Sur iOS 5, cela ne fonctionnera pas, mais la bonne nouvelle est qu’il existe un moyen simple de le faire

.
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

REMARQUE: cela ne fonctionnera que sur iOS 5 et versions ultérieures. Assurez-vous donc de vérifier la version d'IOS si vous souhaitez être compatible avec les versions antérieures.

Les sous-vues de la barre de navigation changent constamment, je veux dire toutes les vues apparaissent / disparaissent, vous ne devez donc pas vous attendre à avoir la vue d'image ajoutée à l'index 0 du tableau des sous-vues.

Vous pouvez essayer d'ajouter ceci à viewDidAppear (dans tous les contrôleurs de vues gérant les éléments de navigation /:):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

J'ai utilisé la solution de Hauek mais lorsque la barre a une saveur différente dans les autres contrôleurs, des problèmes mineurs peuvent survenir, De toute façon, ce n’est ni la meilleure option.

J'espère que cela vous aidera, au moins à comprendre pourquoi ce que vous faisiez ne fonctionnait pas,

Au lieu de le faire dans drawRect: , vous pouvez remplacer la méthode drawLayer: inContext: dans une classe de catégorie UINavigationBar. Dans la méthode drawLayer: inContext: , vous pouvez dessiner l'image d'arrière-plan que vous souhaitez utiliser. Vous pouvez également choisir différentes images pour les orientations des interfaces portrait et paysage si votre application prend en charge plusieurs orientations.

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

Ce projet de démonstration Xcode complet sur la personnalisation de l'apparence de UINavigationBar pourrait également être utile.

La façon dont vous pouvez simplement ajouter un nouvel arrière-plan à votre barre UINavigation est la suivante.

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top