Привет друзья я новичок в разработке iphone. Я борюсь с добавлением значений значка на элементе UIBarbutton справа. Я пробовал, но не могу решить эту проблему. Может кто-нибудь помочь мне.
Заранее спасибо!
Привет друзья я новичок в разработке iphone. Я борюсь с добавлением значений значка на элементе UIBarbutton справа. Я пробовал, но не могу решить эту проблему. Может кто-нибудь помочь мне.
Заранее спасибо!
Я знаю, что этот пост довольно старый, но с iOS7 внешний вид MKNumberBadgeView на самом деле не соответствует дизайну значка элемента панели вкладок. Я нашел этот другой компонент, который наследует UIBarButtonItem и очень хорошо выполняет свою работу:
https://github.com/TanguyAladenise/BBBadgeBarButtonItem
Надеюсь, это может помочь другим разработчикам iOS7, таким как я.
Наконец я нашел способ добавить значки на элемент 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;
Спасибо.
phyzalis имеет хороший ответ, здесь есть классифицированная версия его решения:
Вот как вы можете его использовать:
// 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";
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(buttonPressed)]; [self.navigationItem.rightBarButtonItem.badge addGestureRecognizer:tapGesture];
- person Guruniverse; 13.03.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];
}
Это простой и лучший способ!
MKNumberBadgeView *numberBadge = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(230, -51, 40, 40)];
numberBadge.value = 5;
self.navigationController.navigationBar.layer.zPosition = -1;
[self.view addSubview:numberBadge];
Обновлено для 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()
//Примечание. Увеличьте свой значок в соответствии с полученным уведомлением. Вы должны написать свой код в соответствии с выбранной вами логикой, т. е. как сохранить этот номер значка в базе данных.
Наслаждайтесь..!
Я знаю, что это уже решено, но я подумал, что могу добавить то, что я обнаружил, к этому ответу для полноты картины.
Вы также можете просто добавить 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. Вам также нужно будет поиграть с рамкой, чтобы значок отображался в нужном месте.
Таким образом, вам не придется удалять/добавлять представление с панели навигации.
После поиска слишком большого количества решений я нашел это лучшее решение для 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
Надеюсь, это будет работать !!!
Расширение для добавления 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
}
}
Вот простое решение для Swift 4 (с некоторой настройкой) https://github.com/Syngmaster/BadgedBarButtonItem< /а>
Просто перетащите класс в свой проект, и вы можете использовать его следующим образом:
class ViewController: UIViewController {
let btn = BadgedButtonItem(with: UIImage(named: "your_image"))
override func viewDidLoad() {
super.viewDidLoad()
btn.badgeTextColor = .black
btn.badgeTintColor = .yellow
btn.position = .right
btn.hasBorder = true
btn.borderColor = .red
btn.badgeSize = .medium
btn.badgeAnimation = true
self.navigationItem.rightBarButtonItem = btn
btn.tapAction = {
self.btn.setBadge(with: 4)
}
}
}