Jak dodać odznaki na przedmiot UIBarbutton?

Cześć przyjaciele jestem nowy w rozwoju iphone. Mam problem z dodaniem wartości znaczków na elemencie UIBarbutton po prawej stronie. Próbowałem, ale nie mogę rozwiązać tego problemu. Czy ktoś może mi pomóc?

Z góry dzięki!

Author: Andrey Chevozerov, 2011-04-16

9 answers

Wiem, że ten post jest dość stary, ale z iOS7 wygląd MKNumberBadgeView nie pasuje do projektu znaczka elementu paska kart. Znalazłem ten drugi komponent, który dziedziczy UIBarButtonItem i wykonuje pracę bardzo dobrze:

Https://github.com/TanguyAladenise/BBBadgeBarButtonItem

Mam nadzieję, że to może pomóc innym programistom iOS7, takim jak ja

 30
Author: phyzalis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 05:38:27

W końcu znalazłem sposób, aby dodać odznaki na przedmiot UIBarbutton. Szukałem dużo, ale nie znalazłem prawidłowej odpowiedzi. Więc utworzyłem UIButton i dodałem go jako niestandardowy widok na pozycji rightbarbutton. Dodaj dodaj MKNumberBadgeView, aby wyświetlić numer odznaki. Poniżej mam dodać mój kod dla Ciebie.

// 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;
Dzięki.
 29
Author: Yuvaraj.M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 13:02:11

Phyzalis ma dobrą odpowiedź, jest tu skategoryzowana Wersja jego rozwiązania:

UIBarButtonItem + Badge

Oto jak możesz go użyć:

// 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";
 19
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-07 14:53:02

Zrobiłem coś podobnego do Maxmy, ale po prostu poszedłem naprzód i dodałem odznakę bezpośrednio do jaźni.navigationController.pasek nawigacyjny.

Tutaj wpisz opis obrazka

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

[self.navigationController.navigationBar addSubview:numberBadge];

Po prostu upewnij się, aby usunąć go z podview podczas viewWillDisappear i dodać go z powrotem podczas viewDidAppear. To nadal wydaje się trochę trudne, ale jestem bardziej komfortowe z tym włamaniem niż zmiana paska nawigacyjnego z-order.

Aby usunąć go podczas viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [numberBadge removeFromSuperview]; 
}
 12
Author: Tod Cunningham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 15:38:26

To prosty i najlepszy sposób !

Tutaj wpisz opis obrazka

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

self.navigationController.navigationBar.layer.zPosition = -1;
[self.view addSubview:numberBadge];
 7
Author: MaxMa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-19 07:34:34

Zaktualizowano dla Swift 3:

Użyj poniższego prostego kodu, aby dodać plakietkę na 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()

//Uwaga: Zwiększ swoją odznakę zgodnie z otrzymanym powiadomieniem.Musisz napisać swój kod zgodnie z Twoją logiką, czyli jak utrzymać numer odznaki w bazie danych.

Smacznego..!
 1
Author: Kiran jadhav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 07:05:52

Wiem, że to już zostało rozwiązane, ale pomyślałem, że mogę dodać to, co odkryłem do tej odpowiedzi ze względu na kompletność.

Możesz również po prostu dodać MKNumberBadgeView bezpośrednio do widoku UIBarButtonItem. Używając MonoTouch (C#), w ten sposób otrzymujesz widok dla 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> 

Jestem pewien, że łatwo jest przekonwertować to na Obj-C. będziesz również musiał pobawić się ramką, aby odznaka pojawiła się we właściwym miejscu.

W ten sposób nie będziesz musiał usuwać/dodawać widok z paska nawigacyjnego.

 0
Author: ceiling cat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 18:36:41

Po przeszukaniu zbyt wielu rozwiązań znalazłem to najlepsze rozwiązanie dla Objective-C

Przejdź do linku i pobierz dwa pliki "UIBarButtonItem+Badge.h " i " UIBarButtonItem+Odznaka.m " i dodaj do swojego projektu:

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

Następnie zaimportuj do swojej klasy:

#import "UIBarButtonItem+Badge.h"

I zapisz następujący wiersz, aby dodać znaczek:

self.navigationItem.rightBarButtonItem.badgeValue = @"1"; //your value 
Mam nadzieję, że się uda !!!
 0
Author: Mandar Choudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-13 07:06:54

Rozszerzenie do dodawania interfejsu Użytkownika bez zastępowania interfejsu użytkownika.

Extension UIBarButtonItem {

func startLoading() {
    guard let view = self.value(forKey: "view") as? UIView else { return }
    let loading = UIActivityIndicatorView(activityIndicatorStyle: .gray)
    loading.frame = view.bounds
    loading.startAnimating()
    view.addSubview(loading)
    view.bringSubview(toFront: loading)
    let buttonView = view.subviews.first
    buttonView?.alpha = 0.1
}

func stopLoading() {
    guard let view = self.value(forKey: "view") as? UIView else { return }
    let loading = view.subviews.filter({ $0 is UIActivityIndicatorView }).first
    loading?.removeFromSuperview()
    let buttonView = view.subviews.first
    buttonView?.alpha = 1.0
}

}

 0
Author: Allan Alves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 21:17:28