2014-06-12 11 views
6

Ich habe eine Navigationsleiste mit zwei Tasten, eine ist eine Zurück-Taste die andere ein Chat-Symbol.Wie man ein Abzeichen auf benutzerdefiniertes UIBarButtonItem setzt

Ich schreibe diesen Code wie folgt:

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

Das Problem, das ich habe, ist, dass, wenn es einige neue Nachrichten im Chat ist, dass ich noch nicht gesehen hat, sollte es wie ein Abzeichen von irgendeiner Art sein, oder ein benutzerdefiniertes Label über der Chat-Schaltfläche, um anzuzeigen, wie viele neue Nachrichten Sie haben.

Wie mache ich das?

+0

Zeigen Sie der eff Sie haben bei der Implementierung eines gemacht. –

+0

Wie wäre es mit Code schreiben, um zu überprüfen, ob Sie einige ungelesene Nachrichten haben oder nicht in Ihrer 'viewDidLoad' Methode. Und wenn die Rückgabe wahr ist, dann ändere das Bild der Schaltfläche, ansonsten behalte es so wie es ist. –

+0

Ich habe Code, der mir die Anzahl der Chat-Nachrichten gibt, die ich nicht gesehen habe. Das Problem ist, dass das Bild diese Nummer enthalten muss. Das würde bedeuten, dass ich viele Bilder einfügen musste. – niper007

Antwort

7

in iOS 8 - ich war in der Lage, es zu tun, indem Sie die badgeValue Ändern

  self.messageButton.badgeValue = @"5"; 

wo Nachricht Taste a UIBarButton

Sie haben diese beiden Dateien auf Ihrem Xcode UIBarButtonItem + Badge.h UIBarButtonItem + Badge.m

umfassen, die hier

gefunden werden kann

Github link to files

+0

UIBarButtonItem + Badge.h UIBarButtonItem + Badge.m – Ronaldoh1

+0

Der obige Link bietet eine großartige Kategorie, um dies zu tun. Gab mir genau das, was ich brauchte. –

2

Guten Tag! Hier ist meine Version - einfach und ohne Probleme:

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

einen schönen Tag!

12

für Swift 3.0:

Ergebnis:

enter image description here

Code:

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 = .red 
    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") 
} 
+0

Ausprobiert, sieht soweit gut aus! Vielen Dank. – D6mi

2

Sie dieses Stück Code versuchen: -

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; 
Verwandte Themen