ios iphone uibarbuttonitem

ios - UIBarButtonItem con imagen personalizada y sin borde



iphone (9)

Esto también se puede hacer mediante programación (por supuesto):

Primero, crea una vista personalizada. Esta vista personalizada puede contener una imagen, botón o cualquier otra cosa que desee. La vista personalizada se puede realizar mediante programación o en IB:

UIImage *customImage = [UIImage imageNamed:@"imageName"]; UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, customImage.size.width, customImage.size.height)]; customView.backgroundColor = [UIColor colorWithPatternImage:customImage];

A continuación, cree un UIBarButtonItem e inícielo con la vista personalizada.

UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView];

Ahora, simplemente agregue el UIBarButton personalizado al leftBarButtonItem:

self.navigationItem.leftBarButtonItem = customBarButtonItem;

Quiero crear un UIBarButtonItem con una imagen personalizada, pero no quiero el borde que agrega el iPhone, ya que mi Imagen tiene un borde especial.

Es lo mismo que el botón de retroceso pero un botón de avance.

Esta aplicación es para un proyecto inHouse, así que no me importa si Apple la rechaza o la aprueba o si le gusta :-)

Si utilizo la propiedad initWithCustomView: v del UIBarButtonItem, puedo hacerlo:

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];

Esto funciona, pero si tengo que repetir este proceso en 10 vistas, esto no es SECO.

Supongo que tengo que crear una subclase, ¿pero qué?

  • NSView?
  • UIBarButtonItem?

Gracias,

Saludos,


Lo encontré de esta manera fácil. Está sugerido en la parte superior. "random.png" tiene que estar en proyecto. Solo arrastre y suelte cualquier imagen.

UIButton *a1 = [UIButton buttonWithType:UIButtonTypeCustom]; [a1 setFrame:CGRectMake(0.0f, 0.0f, 25.0f, 25.0f)]; [a1 addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside]; [a1 setImage:[UIImage imageNamed:@"config.png"] forState:UIControlStateNormal]; UIBarButtonItem *random = [[UIBarButtonItem alloc] initWithCustomView:a1]; //? line incomplete ?// imageNamed:@"random.png"] style:UIBarButtonItemStylePlain target:self action:@selector(randomMsg)]; self.navigationItem.rightBarButtonItem = random;


Mira esto solución simple.

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController { barButtonItem.image = [UIImage imageNamed:@"navButton.png"]; barButtonItem.style = UIBarButtonItemStylePlain; [barButtonItem setBackgroundImage:[UIImage imageNamed:@"1x1.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; self.masterPopoverController = popoverController; }

Aquí 1x1.png es una imagen png transparente de 1 píxel que puede descargar desde el siguiente enlace

http://commons.wikimedia.org/wiki/File:1x1.png


Ok esa categoría funciona muy bien porque no hay problemas con Popovercontroller :-)

#import <UIKit/UIKit.h> @interface UIBarButtonItem (BarButtonItemExtended) + (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action; -(void)performBarButtonAction:(id)sender; @end #import "UIBarButtonItem+BarButtonItemExtended.h" @implementation UIBarButtonItem (BarButtonItemExtended) + (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action { UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom]; [imgButton setImage:image forState:UIControlStateNormal]; imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); UIBarButtonItem *b = [[UIBarButtonItem alloc]initWithCustomView:imgButton]; [imgButton addTarget:b action:@selector(performBarButtonAction:) forControlEvents:UIControlEventTouchUpInside]; [b setAction:action]; [b setTarget:target]; return b; } -(void)performBarButtonAction:(UIButton*)sender { [[self target] performSelector:self.action withObject:self]; } @end


Otra solución simple es

  1. Arrastre un UIButton estándar
  2. Establezca el estilo del botón como personalizado y configure su imagen para ese botón
  3. Arrastralo a UINavigationBar
  4. Set Selector

Otra solución, creo que es más simple en caso de que al crear un botón programáticamente:

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:defaultImage landscapeImagePhone:landscapeImage style:UIBarButtonItemStylePlain target:self action:@selector(someSelector)]; [button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];


Puede agregar un método a UIBarButtonItem sin subclasificarlo usando una categoría personalizada:

@interface UIBarButtonItem(MyCategory) + (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action; @end @implementation UIBarButtonItem(MyCategory) + (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{ // Move your item creation code here } @end

Entonces, en cualquier lugar de su código, puede crear un artículo de barra que invoque este método (siempre que incluya un encabezado con su declaración).

PD. No necesita usar ''v'' UIView ya que puede crear UIBarButtonItem con un botón como vista personalizada directamente.
PPS También necesita [liberación anticipada] en su código.


Una alternativa es subclase UIBarButtonItem. ¿Por qué? De modo que la acción se invoca en el destino con el remitente correcto. En el código anterior, el argumento del remitente en el mensaje de acción es la instancia de UIButton, no la instancia de UIBarButtonItem. Esto sería importante, por ejemplo, si desea presentar un UIPopoverController desde el elemento del botón de la barra. Al crear una subclase de UIBarButtonItem, puede agregar un ivar que conserve el objetivo original, permitiendo que nuestras instancias de subclase intercepten, modifiquen y reenvíen el mensaje de acción con el remitente adecuado.

Entonces, CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h> @interface CCFBarButtonItem : UIBarButtonItem { @protected id _originalTarget; } - (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action; @end

y 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


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