2 votes

La sous-vue UINavigationBar cache le bon UIBarButtonItem.

Dans le contrôleur de la vue de la table racine, j'ajoute une vue secondaire qui contient une image :

[self.navigationController.navigationBar addSubview:imageView];

Ensuite, dans un contrôleur de vue de table enfant que je pousse sur la pile, je définis un UIBarButtonItem droit :

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

Je ne comprends pas pourquoi le bouton ne s'affiche pas dans la barre de navigation. Si j'appuie sur (l'espace vide), la méthode rightAction : est invoquée et le bouton "est" là, mais il ne s'affiche pas.

J'ai essayé d'envoyer la sous-vue imageView à l'arrière de la barre de navigation, mais en vain. C'est assez logique puisque le bouton appartient en fait à l'UINavigationItem de toute façon...

Quelqu'un sait-il comment je peux faire en sorte que ce bouton s'affiche correctement ?

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

0voto

coneybeare Points 23802

Une meilleure façon d'ajouter une image à un UINavigationBar est de le sous-classer ou de créer une catégorie et de remplacer l'élément drawRect méthode :

//                                  #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 procédant de cette manière, vos boutons s'afficheront correctement et ce sera moins "bricolé".

0voto

Thomas Müller Points 7712

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

self.navigationItem.titleView = imageView;

Je suppose que le UINavigationBar affiche le UINavigationItem dans une sous-vue, et vous ajoutez votre UIImageView au dessus de cette sous-vue.

Dans l'une de mes vues, j'affiche une étiquette et une image à côté d'elle. Je pense que j'ai simplement ajouté l'étiquette et l'image à une vue que j'ai ensuite utilisée pour la titleView.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X