2

Dans le contrôleur de vue de la table racine ajouter une sous-vue qui détient une image:UINavigationBar sous-vue se cache le droit UIBarButtonItem

[self.navigationController.navigationBar addSubview:imageView]; 

Puis dans un contrôleur de vue de la table des enfants que je pousse sur la pile, je mets un droit UIBarButtonItem :

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightAction:)]; 
self.navigationItem.rightBarButtonItem = rightButton; 
[rightButton release]; 

Je n'arrive pas à comprendre pourquoi le bouton n'est pas affiché dans la barre de navigation. Si je tape (l'espace vide) la méthode rightAction: est invoquée de sorte que le bouton "est" là, attendez qu'il ne soit pas affiché.

J'ai essayé d'envoyer la sous-vue imageView dans la barre de navigation mais en vain. Cela a du sens puisque le bouton appartient en fait à l'UINavigationItem ...

Est-ce que quelqu'un sait comment afficher ce bouton correctement?

Mise à jour: le bouton de retour n'affiche correctement, mais il est ajouté par le système mais ...

Répondre

0

Une meilleure façon d'ajouter une image à un UINavigationBar est sous-classe ou faire une catégorie et remplacer la méthode drawRect :

//         #Lighter r,g,b,a   #Darker r,g,b,a 
#define MAIN_COLOR_COMPONENTS  { 0.153, 0.306, 0.553, 1.0, 0.122, 0.247, 0.482, 1.0 } 
#define LIGHT_COLOR_COMPONENTS  { 0.478, 0.573, 0.725, 1.0, 0.216, 0.357, 0.584, 1.0 } 

@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawRect:(CGRect)rect { 
    if (imageReady) { 
     UIImage *img = [UIImage imageNamed: @"navigation_background.png"]; 
     [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    } else { 
     // Render yourself instead. 
     // You will need to adjust the MAIN_COLOR_COMPONENTS and LIGHT_COLOR_COMPONENTS to match your app 

     // emulate the tint colored bar 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGFloat locations[2] = { 0.0, 1.0 }; 
     CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 

     CGFloat topComponents[8] = LIGHT_COLOR_COMPONENTS; 
     CGGradientRef topGradient = CGGradientCreateWithColorComponents(myColorspace, topComponents, locations, 2); 
     CGContextDrawLinearGradient(context, topGradient, CGPointMake(0, 0), CGPointMake(0,self.frame.size.height/2), 0); 
     CGGradientRelease(topGradient); 

     CGFloat botComponents[8] = MAIN_COLOR_COMPONENTS; 
     CGGradientRef botGradient = CGGradientCreateWithColorComponents(myColorspace, botComponents, locations, 2); 
     CGContextDrawLinearGradient(context, botGradient, 
     CGPointMake(0,self.frame.size.height/2), CGPointMake(0, self.frame.size.height), 0); 
     CGGradientRelease(botGradient); 

     CGColorSpaceRelease(myColorspace); 


     // top Line 
     CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0); 
     CGContextMoveToPoint(context, 0, 0); 
     CGContextAddLineToPoint(context, self.frame.size.width, 0); 
     CGContextStrokePath(context); 

     // bottom line 
     CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0); 
     CGContextMoveToPoint(context, 0, self.frame.size.height); 
     CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height); 
     CGContextStrokePath(context); 
    } 
} 

@end 

En faisant cela, vos boutons apparaîtront correctement et seront moins "hacky".

+0

Je pourrais sous-classer le UINavigationBar mais la propriété est en lecture seule dans le UINavigationController ... l'autre chose est que l'image est réellement extraite d'un serveur donc elle doit être définie à la volée. – nicktmro

+0

J'ai accepté votre réponse mais j'apprécierais vraiment votre contribution avec ce qui suit: si mon image n'est pas prête quand j'affiche la barre de navigation, je reçois un fond noir. Toute modification que je pourrais revenir au fond/style bleu par défaut sans utiliser une image? – nicktmro

+0

oui, je vais mettre à jour le code – coneybeare

0

Je pense que vous devriez définir l'affichage du titre de l'élément de navigation sur votre imageView.

self.navigationItem.titleView = imageView; 

Je suppose que le UINavigationBar affiche les UINavigationItem s dans un sous-vue, et vous étiez en ajoutant vos UIImageView au-dessus de cette sous-vue.

Dans l'une de mes vues, j'affiche une étiquette et une image à côté. Je pense que je viens d'ajouter l'étiquette et l'image à une vue que j'ai ensuite utilisée pour le titre.

+0

Cela fonctionnerait normalement mais le titleView ne couvre pas tout l'écran. Je suppose que c'est seulement 300px plutôt que 320. – nicktmro

+0

Je suppose que vous le voulez comme une image de fond alors? OK, alors essayez peut-être d'ajouter votre imageView à l'index 0 (-insertSubview: atIndex :) –

Questions connexes