Cómo poner un distintivo en UIBarButtonItem personalizado

Tengo una barra de navigation con dos botones, uno es un button de retroceso y el otro un símbolo de chat.

Escribo este código así:

UIBarButtonItem *_btn=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"back.png"] style:UIBarButtonItemStylePlain target:self action:@selector(goBackToPreviousView)]; self.navigationItem.leftBarButtonItem=_btn; self.navigationItem.leftBarButtonItem.tintColor = [UIColor blackColor]; UIBarButtonItem *_btn2=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"chat.png"] style:UIBarButtonItemStylePlain target:self action:@selector(startChat)]; self.navigationItem.rightBarButtonItem=_btn2; self.navigationItem.rightBarButtonItem.tintColor = [Utility colorWithHexValue:CyanBlue]; 

El problema que tengo es que cada vez que hay algunos posts nuevos en el chat que no he visto, debería haber como una insignia de algún tipo, o una label personalizada sobre el button de chat, para indicar cuántos posts nuevos tienes.

¿Cómo hago esto?

en iOS 8: pude hacerlo cambiando el badgeValue

  self.messageButton.badgeValue = @"5"; 

donde el button de post es un UIBarButton

Tienes que include estos dos files en tu xcode UIBarButtonItem + Badge.h UIBarButtonItem + Badge.m

que se puede encontrar aquí

Enlace de Github a los files

para Swift 3.0 :

Resultado:

introduzca la descripción de la imagen aquí

Código:

 override func viewDidLoad() { super.viewDidLoad() // badge label let label = UILabel(frame: CGRect(x: 10, y: -10, width: 20, height: 20)) 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.font = UIFont(name: "SanFranciscoText-Light", size: 13) label.textColor = .white label.backgroundColor = .networking label.text = "80" // button let rightButton = UIButton(frame: CGRect(x: 0, y: 0, width: 18, height: 16)) rightButton.setBackgroundImage(UIImage(named: "inbox"), for: .normal) rightButton.addTarget(self, action: #selector(rightButtonTouched), for: .touchUpInside) rightButton.addSubview(label) // Bar button item let rightBarButtomItem = UIBarButtonItem(customView: rightButton) navigationItem.rightBarButtonItem = rightBarButtomItem } func rightButtonTouched() { print("right button touched") } 

¡Buen día! Aquí está mi versión: fácil y sin ningún problema:

 navBar = [[UINavigationBar alloc] initWithFrame: CGRectMake(0, 0, self.view.frame.size.width, 64)]; [self.view addSubview:navBar]; navItem = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(@"Meetings", nil)]; [navBar pushNavigationItem:navItem animated:NO]; UIButton *chat = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [chat setTitle:@"Chat" forState: UIControlStateNormal]; UILabel *badge = [[UILabel alloc] initWithFrame: CGRectMake(0, 0, 20, 20)]; badge.textColor = [UIColor darkGrayColor]; badge.font = [UIFont fontWithName: fontName size: 15]; badge.text = @"10"; badge.textAlignment = NSTextAlignmentCenter; badge.layer.cornerRadius = 10.0f; badge.layer.backgroundColor = [UIColor yellowColor].CGColor; badge.clipsToBounds = YES; badge.center = CGPointMake(50, 20); [chat addSubview: badge]; navItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: chat]; 

¡que tengas un buen día!

Puedes probar esta categoría

UIBarButtonItem-Badge

Prueba este control personalizado : mknumberbadgeview

Puedes probar esta pieza de código:

  UILabel *badgeLbl = [[UILabel alloc]initWithFrame:CGRectMake(16, -2, 18, 18)]; badgeLbl.backgroundColor = [UIColor whiteColor]; badgeLbl.textColor = [UIColor blackColor]; badgeLbl.textAlignment = NSTextAlignmentCenter; badgeLbl.layer.cornerRadius = 9.0; badgeLbl.layer.masksToBounds = true; badgeLbl.text = @"10"; UIButton *notificationBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 35, 35)]; [notificationBtn setBackgroundImage:[UIImage imageNamed:@"image_name"] forState:UIControlStateNormal]; [notificationBtn setTitle:@"" forState:UIControlStateNormal]; [notificationBtn addTarget:self action:@selector(onClickAction:) forControlEvents:UIControlEventTouchUpInside]; [notificationBtn addSubview:badgeLbl]; UIBarButtonItem *notificationBarBtn = [[UIBarButtonItem alloc]initWithCustomView:notificationBtn]; self.navigationItem.rightBarButtonItem = notificationBarBtn;