2011-04-16 17 views

Respuesta

29

Finalmente encontré la manera de agregar insignias en el ítem UIBarbutton. Busqué mucho pero no encontré la respuesta correcta. Así que creé UIButton y lo agregué como una vista personalizada en el elemento de la barra derecha. Agregue agregue el MKNumberBadgeView para exhibir el número de la insignia. A continuación he agregado mi código para usted.

// Initialize NKNumberBadgeView... 
MKNumberBadgeView *number = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(60, 00, 30,20)]; 
number.value = 10; 

// Allocate UIButton 
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    btn.frame = CGRectMake(0, 0, 70, 30); 
    btn.layer.cornerRadius = 8; 
    [btn setTitle:@"Button" forState:UIControlStateNormal]; 
    [btn addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside]; 
    //[btn setBackgroundColor:[UIColor blueColor]]; 
    [btn setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.1 alpha:0.2]]; 
    btn.font = [UIFont systemFontOfSize:13]; 
    //[btn setFont:[UIFont systemFontOfSize:13]]; 
    [btn addSubview:number]; //Add NKNumberBadgeView as a subview on UIButton 

// Initialize UIBarbuttonitem... 
UIBarButtonItem *proe = [[UIBarButtonItem alloc] initWithCustomView:btn]; 
self.navigationItem.leftBarButtonItem = proe; 

Thanks.

+0

Los resultados de este código crean un botón muy feo (pero funciona). Has sido advertido;) – Ralphleon

+0

Esto funciona mejor en iOS 5 porque puedes tener más control sobre la apariencia de los botones. De lo contrario, terminas con botones feos en la barra de navegación. – Quentamia

7

¡Es simple y la mejor manera!

enter image description here

MKNumberBadgeView *numberBadge = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(230, -51, 40, 40)]; 
numberBadge.value = 5; 

self.navigationController.navigationBar.layer.zPosition = -1; 
[self.view addSubview:numberBadge]; 
12

hice algo similar a MAXMA, pero simplemente siguió adelante y añadió la placa directamente a la self.navigationController.navigationBar.

enter image description here

MKNumberBadgeView *numberBadge = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(35, 0, 40, 40)]; 
numberBadge.value = 1; 

[self.navigationController.navigationBar addSubview:numberBadge]; 

Sólo asegúrese de quitarlo de la vista secundaria durante viewWillDisappear y añadir de nuevo durante viewDidAppear. Todavía parece un poco hacky, pero estoy más cómodo con este truco y luego cambio el orden z de la barra de navegación.

para quitarlo durante viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [numberBadge removeFromSuperview]; 
} 
+0

¿Cómo se elimina a la vista? ¿Va a desaparecer? ¿Podría agregar ese código? – daniel

+1

Claro, agregué el ejemplo para mostrar cómo eliminarlo cuando la vista desaparece. –

0

Sé que esto ha sido resuelto ya, pero pensé que podría añadir lo que he descubierto a esta respuesta en aras de la exhaustividad.

También puede simplemente agregar MKNumberBadgeView directamente a la vista para UIBarButtonItem. Usando MonoTouch (C#), así es como se obtiene la vista para la UIBarButtonItem

 //barbutton is some UIBarButtonItem. Make sure to check for view. In 
     //ViewDidLoad(), the view for the barbutton might not exist yet. 
     Selector sel = new Selector("view"); 
     var handle = Messaging.intptr_objc_msgSend(barbutton.Handle, sel.Handle); 
     var view = Runtime.GetNSObject(handle) as UIView; 
     var mkBadge = ... //the badge 
     view.Add(badge); 
     view.Layer.ZPosition = <some large number> 

Estoy seguro de que es fácil de convertir esto en Obj-C. También necesitarás jugar con el Marco de la insignia para que aparezca en el lugar correcto.

De esta manera usted no tendrá que quitar/añadir la vista desde la navigationbar.

30

Sé que este post es bastante antiguo pero con iOS7, la apariencia de MKNumberBadgeView en realidad no coinciden con el diseño elemento insignia barra de pestañas. he encontrado este otro componente que herits UIBarButtonItem y hacer el trabajo muy bien:

https://github.com/TanguyAladenise/BBBadgeBarButtonItem

la esperanza que esto puede ayudar a otros desarrolladores iOS7 como yo

18

phyzalis tiene una buena respuesta, hay una versión clasificada de su solución aquí:

UIBarButtonItem+Badge

Así es como se puede usar:

// Build your regular UIBarButtonItem with Custom View 
UIImage *image = [UIImage imageNamed:@"someImage"]; 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.frame = CGRectMake(0,0,image.size.width, image.size.height); 
[button addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchDown]; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 

// Make BarButton Item 
UIBarButtonItem *navLeftButton = [[UIBarButtonItem alloc] initWithCustomView:button]; 
self.navigationItem.leftBarButtonItem = navLeftButton; 

// this is the key entry to change the badgeValue 
self.navigationItem.leftBarButtonItem.badgeValue = @"1"; 
+0

¡La respuesta perfecta! – hyd00

+0

¿Tengo el problema de que "Property" badgeValue "no encontrado en UIBarButtonItem"? –

+1

No funciona en iOS 11 y xcode 9 .. –

0

Actualizado para la Swift 3:

utilizar por debajo de código simple para agregar la tarjeta de identificación en UIBarButtonItem;

// Variable Declartion 

var badgeCount = Int() 

// Instance Method 

    func setUpBadgeCountAndBarButton() { 
     // badge label 
     let label = UILabel(frame: CGRect(x: 10, y: -05, width: 25, height: 25)) 
     label.layer.borderColor = UIColor.clear.cgColor 
     label.layer.borderWidth = 2 
     label.layer.cornerRadius = label.bounds.size.height/2 
     label.textAlignment = .center 
     label.layer.masksToBounds = true 
     label.textColor = .white 
     label.font = label.font.withSize(12) 
     label.backgroundColor = .red 
     label.text = "\(self.badgeCount)" 

     // button 
     let rightButton = UIButton(frame: CGRect(x: 0, y: 0, width: 35, height: 35)) 
     rightButton.setBackgroundImage(UIImage(named: "notification_dash"), for: .normal) 
     rightButton.addTarget(self, action: #selector(notificationBarButtonClick), for: .touchUpInside) 
     rightButton.addSubview(label) 

     // Bar button item 
     let rightBarButtomItem = UIBarButtonItem(customView: rightButton) 
     navigationItem.rightBarButtonItem = rightBarButtomItem 
    } 

// Call To Method 

self.badgeCount = 11 
self.setUpBadgeCountAndBarButton() 

// Nota: Aumentar su tarjeta de identificación según usted recibió notification.You tener que escribir el código como por su decidido que su lógica es decir, la forma de mantener ese número recuento de placa en la base de datos.

Disfrute ..! Ð

0

Después de buscar demasiadas soluciones que encontré este mejor solución para Objective-C

Goto siguiente enlace y descargue dos archivos "UIBarButtonItem + Badge.h" y"UIBarButtonItem + Badge.m" y añadir a su proyecto:

https://github.com/mikeMTOL/UIBarButtonItem-Badge

Luego de importación en su clase:

#import "UIBarButtonItem+Badge.h" 

y anotar siguiente línea para añadir insignia:

self.navigationItem.rightBarButtonItem.badgeValue = @"1"; //your value 

espero que trabajará !!!

Cuestiones relacionadas