Как добавить значки на элемент UIBarbutton?

Привет друзья я новичок в разработке iphone. Я борюсь с добавлением значений значка на элементе UIBarbutton справа. Я пробовал, но не могу решить эту проблему. Может кто-нибудь помочь мне.

Заранее спасибо!


person Yuvaraj.M    schedule 16.04.2011    source источник


Ответы (10)


Я знаю, что этот пост довольно старый, но с iOS7 внешний вид MKNumberBadgeView на самом деле не соответствует дизайну значка элемента панели вкладок. Я нашел этот другой компонент, который наследует UIBarButtonItem и очень хорошо выполняет свою работу:

https://github.com/TanguyAladenise/BBBadgeBarButtonItem

Надеюсь, это может помочь другим разработчикам iOS7, таким как я.

person phyzalis    schedule 12.03.2014

Наконец я нашел способ добавить значки на элемент UIBarbutton. Я много искал, но не нашел правильного ответа. Итак, я создал UIButton и добавил его как пользовательское представление для элемента правой панели. Добавьте MKNumberBadgeView для отображения номера значка. Ниже я добавил свой код для вас.

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

Спасибо.

person Yuvaraj.M    schedule 19.04.2011
comment
В результате этого кода получается очень уродливая кнопка (но она работает). Вас предупредили ;) - person Ralphleon; 20.02.2012
comment
Это лучше работает на iOS 5, потому что вы можете больше контролировать внешний вид кнопок. В противном случае вы получите уродливые кнопки на панели навигации. - person Quentamia; 10.05.2012

phyzalis имеет хороший ответ, здесь есть классифицированная версия его решения:

UIBarButtonItem+Значок

Вот как вы можете его использовать:

// 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";
person Mike    schedule 07.05.2014
comment
У меня возникла проблема, что свойство badgeValue не найдено в UIBarButtonItem? - person Chenya Zhang; 05.10.2016
comment
Отлично работает в iOS 11 в моем приложении. Единственная проблема заключается в том, что сам значок не реагирует на нажатия, что затрудняет нажатие кнопки. Исправлено это путем добавления распознавателя жестов к значку: UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(buttonPressed)]; [self.navigationItem.rightBarButtonItem.badge addGestureRecognizer:tapGesture]; - person Guruniverse; 13.03.2018
comment
См. мой ответ по проблеме iOS 11 из репозитория lib на Github github.com/mikeMTOL/UIBarButtonItem- Значок/вопросы/37 - person Phu Nguyen; 25.05.2018

Я сделал что-то похожее на MaxMa, но просто добавил значок прямо в self.navigationController.navigationBar.

введите здесь описание изображения

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

[self.navigationController.navigationBar addSubview:numberBadge];

Просто не забудьте удалить его из подвида во время viewWillDisappear и добавить обратно во время viewDidAppear. Это все еще кажется немного хакерским, но мне больше нравится этот хак, чем изменение z-порядка панели навигации.

Чтобы удалить его во время просмотраWillDisappear

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [numberBadge removeFromSuperview]; 
}
person Tod Cunningham    schedule 26.11.2012
comment
Как удалить его в viewWillDisappear? Не могли бы вы добавить этот код? - person daniel; 01.12.2012
comment
Конечно, я добавил пример, чтобы показать, как удалить его, когда представление исчезает. - person Tod Cunningham; 05.12.2012

Это простой и лучший способ!

введите здесь описание изображения

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

self.navigationController.navigationBar.layer.zPosition = -1;
[self.view addSubview:numberBadge];
person MaxMa    schedule 19.11.2012
comment
Вы полагаетесь на то, что кадр будет ровно на 230 вправо. Может быть, добавить ограничения или что-то в этом роде. Но это в основном не будет работать для любой ширины телефона. - person Travis Delly; 17.07.2018

Обновлено для Swift 3:

используйте приведенный ниже простой код, чтобы добавить значок на 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()

//Примечание. Увеличьте свой значок в соответствии с полученным уведомлением. Вы должны написать свой код в соответствии с выбранной вами логикой, т. е. как сохранить этот номер значка в базе данных.

Наслаждайтесь..!

person Kiran Jadhav    schedule 06.12.2017

Я знаю, что это уже решено, но я подумал, что могу добавить то, что я обнаружил, к этому ответу для полноты картины.

Вы также можете просто добавить MKNumberBadgeView непосредственно в представление для UIBarButtonItem. Используя Monotouch (C#), вы получаете представление для 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> 

Я уверен, что это легко преобразовать в Obj-C. Вам также нужно будет поиграть с рамкой, чтобы значок отображался в нужном месте.

Таким образом, вам не придется удалять/добавлять представление с панели навигации.

person ceiling cat    schedule 12.08.2013

После поиска слишком большого количества решений я нашел это лучшее решение для Objective-C.

Перейдите по следующей ссылке и загрузите два файла "UIBarButtonItem+Badge.h" и "UIBarButtonItem+Badge.m" и добавьте в свой проект:

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

Затем импортируйте в свой класс:

#import "UIBarButtonItem+Badge.h"

И запишите следующую строку, чтобы добавить значок:

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

Надеюсь, это будет работать !!!

person Mandar Choudhary    schedule 13.01.2018

Расширение для добавления UIActivityIndicatorView без замены UIBarButtonItem.

расширение 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
}

}

person Allan    schedule 02.08.2018