88 votes

UIBarButtonItem avec image personnalisée et sans bordure

Je veux créer un UIBarButtonItem avec une image personnalisée, mais je ne veux pas la frontière de l'iPhone ajoute, comme mon Image a une frontière.

C'est le même que le bouton de retour, mais un bouton vers l'avant.

Cette Application est pour un projet interne, donc je ne m'inquiète pas si Apple rejeter ou s'il l'approuve ou il aime :-)

Si j'utilise le initWithCustomView:v de la propriété de la UIBarButtonItem, je peux le faire:

UIImage *image = [UIImage imageNamed:@"right.png"];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
[button setBackgroundImage: [[UIImage imageNamed: @"right_clicked.png"] stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateHighlighted];

 button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);

[button addTarget:self action:@selector(AcceptData)    forControlEvents:UIControlEventTouchUpInside];

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height) ];

[v addSubview:button];

UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithCustomView:v];

self.navigationItem.rightBarButtonItem= forward;

[v release];
[image release];

Cela fonctionne, mais si je dois répéter ce processus en 10 points de vue, ce n'est pas SÈCHE.

Je suppose que j'ai à la sous-classe, mais quoi ?

  • NSView ?
  • UIBarButtonItem ?

merci,

en ce qui concerne,

50voto

san Points 1897

Une autre solution simple est

  1. Faites glisser un UIButton standard
  2. Affectez style le bouton a le personnalisé et votre image pour ce bouton
  3. Faites-le glisser dans la UINavigationBar
  4. Sélecteur de réglage

44voto

Vladimir Points 110327

Vous pouvez ajouter une méthode à UIBarButtonItem sans sous-classement à l’aide de catégorie personnalisée :

Donc n’importe où dans votre code, vous pouvez créer bar point appel à cette méthode (à condition que vous incluez un en-tête avec sa déclaration).

P.S. Vous n’avez pas besoin d’utiliser « v » UIView que vous pouvez créer `` avec un bouton comme affichage personnalisé directement.
P.P.S. Vous devez également [avant libération] dans votre code.

37voto

m-farhan Points 957

Je l’ai trouvé cette façon facile. C’est sugested sur le dessus. « random.png » doit être dans le projet. Glissez et déposez n’importe quelle image.

6voto

NSBum Points 6570

Une alternative consiste à sous-classe UIBarButtonItem. Pourquoi? De sorte que l'action est appelée sur la cible avec le bon de l'expéditeur. Dans le code ci-dessus, l'expéditeur argument dans le message d'action est la UIButton, par exemple, pas le UIBarButtonItem instance. Ce serait important, par exemple, si vous souhaitez présenter un UIPopoverController à partir du bouton de la barre d'élément. Par sous-classement UIBarButtonItem, vous pouvez ajouter un ivar qui conserve l'original de la cible, permettant à nos sous-classe des instances d'intercepter, de modifier et de transmettre le message de l'action avec le bon de l'expéditeur.

Donc, CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h>

@interface CCFBarButtonItem : UIBarButtonItem
{
@protected
    id _originalTarget;
}
- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action;
@end

et CCFBarButtonItem.m

#import "CCFBarButtonItem.h"
#import <UIKit/UIButton.h>
#import <UIKit/UIView.h>
#import <UIKit/UIImage.h>

@implementation CCFBarButtonItem

#pragma mark - Object life cycle

- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action;
{
    _ASSIGN( _originalTarget, target );

    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [imgButton setImage:image forState:UIControlStateNormal];
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    [imgButton addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];

    self = [super initWithCustomView:imgButton];

    return self;
}

- (void)dealloc;
{
    MCRelease(_originalTarget);
    [super dealloc];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
{
    if( [_originalTarget respondsToSelector:aSelector] )
    {
        return [_originalTarget methodSignatureForSelector:aSelector];
    }
    else
    {
        return [super methodSignatureForSelector:aSelector];
    }
}

- (void)forwardInvocation:(NSInvocation *)anInvocation;
{
    SEL aSelector = [anInvocation selector];
    if( [_originalTarget respondsToSelector:aSelector] )
    {
        //  modify the 'sender' argument so that it points to self
        [anInvocation setArgument:&self atIndex:2];
        [anInvocation invokeWithTarget:_originalTarget];
    }
    else
    {
        [self doesNotRecognizeSelector:aSelector];
    }
}
@end

4voto

Infog Points 694
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"]
                                                                    style:UIBarButtonItemStylePlain
                                                                   target:self
                                                                   action:@selector(showMenu)];

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