2010-08-05 7 views
2

J'ai essayé de comprendre comment afficher une image d'arrière-plan derrière un UINavigationBar sur mon iPhone et je suis venu à travers plusieurs fois la même solution est la suivante:iPhone UINavigationBar look and feel

@implementation UINavigationBar (UINavigationBarCategory) { 
    - (void)drawRect:(CGRect)rect { 
     UIImage *img = [UIImage imageNamed: @"logo_bar.png"]; 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextDrawImage(context, CGRectMake(0, 0, 317, 27), img.CGImage); 
} 
@end 

Qui fonctionne à un degré

Mon image est à l'envers et à l'envers !! pourquoi diable cela serait-il? J'ai vérifié l'image elle-même, ce qui est bien. Où cette transformation serait-elle appliquée?

J'ai aussi d'autres questions, comme:

  1. Comment puis-je choisir d'afficher l'image BG ou peut-être basculer son alpha sur les écrans sélectionnés? Il y a un écran particulier où il y a un bouton de retour et il couvre l'image, ce que je ne veux pas, je préfère ne pas afficher l'image sur cet écran.

  2. L'image n'est pas toute la hauteur du UINavigationBar c'est juste une petite tranche de celui-ci (27 comme vous pouvez le voir). Comment puis-je conserver la couleur de la teinte pour le reste de la barre en utilisant cette technique?

Merci, je ne l'ai pas utilisé Catégories avant qui peut être la clé pour me comprendre, mais peut-être pas ...

Répondre

2
// Drawing code 
CGContextRef c = UIGraphicsGetCurrentContext(); 

UIImage *back=[UIImage imageNamed:@"bar.png"]; 

CGContextScaleCTM(c,1,-1); 
CGContextTranslateCTM(c,0,-44); 

CGContextDrawImage(c,CGRectMake(0, 0, 320, 44),[back CGImage]); 

Voilà comment je tire ma barre de navigation personnalisée. J'espère que cela pourra aider.

+0

qui a réellement fonctionné! Pourquoi avez-vous besoin d'appliquer les échelles et les transformations? – Mark

0

Vous pouvez également le faire dans 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. Ce code prend également en charge les orientations portrait et paysage.

- (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); 
} 

Et this complete demo Xcode project sur la personnalisation de l'apparence de UINavigationBar pourrait être utile.

Questions connexes