ios 如何在 UIBarbutton 项目上添加徽章?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5684636/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to add Badges on UIBarbutton item?
提问by Yuvaraj.M
Hi friends am new to iphone developing. Am struggle with add badge values on UIBarbutton item on right side. I have tried but i can't solve this problem. Can anyone help me.
嗨,朋友们,我是 iphone 开发的新手。我正在努力在右侧的 UIBarbutton 项目上添加徽章值。我试过了,但我无法解决这个问题。谁能帮我。
Thanks in advance!
提前致谢!
采纳答案by Yuvaraj.M
Finally i found the way to add badges on UIBarbutton item. I searched lot but not found the correct answer. So i created UIButton and add it as a Custom view on rightbarbutton item. Add add the MKNumberBadgeViewfor display the badge number. Below i have add my code for you.
最后我找到了在 UIBarbutton 项目上添加徽章的方法。我搜索了很多,但没有找到正确的答案。所以我创建了 UIButton 并将其添加为 rightbarbutton 项目上的自定义视图。添加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;
Thanks.
谢谢。
回答by phyzalis
I know this post is pretty old but with iOS7, MKNumberBadgeView's appearance does not really match the tab bar item badge design. I have found this other component which herits UIBarButtonItem and do the job very well :
我知道这篇文章已经很老了,但是在 iOS7 中,MKNumberBadgeView 的外观与标签栏项目徽章设计并不真正匹配。我发现了另一个继承 UIBarButtonItem 的组件,并且可以很好地完成这项工作:
https://github.com/TanguyAladenise/BBBadgeBarButtonItem
https://github.com/TanguyAladenise/BBBadgeBarButtonItem
Hope this may help other iOS7 developers like me
希望这可以帮助像我这样的其他 iOS7 开发人员
回答by Mike
phyzalis has a good answer, there's a categorized version of his solution here:
phyzalis 有一个很好的答案,这里有他的解决方案的分类版本:
Here's how you can use it:
使用方法如下:
// 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";
回答by Tod Cunningham
I did something similar to MaxMa, but I just went ahead and added the badge directly to the self.navigationController.navigationBar.
我做了一些类似于 MaxMa 的事情,但我只是继续将徽章直接添加到 self.navigationController.navigationBar 中。


MKNumberBadgeView *numberBadge = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(35, 0, 40, 40)];
numberBadge.value = 1;
[self.navigationController.navigationBar addSubview:numberBadge];
Just make sure to remove it from the subview during viewWillDisappear and add it back during viewDidAppear. It still seems a little hacky, but I'm more comfortable with this hack then changing the nav bar z-order.
只需确保在 viewWillDisappear 期间将其从子视图中删除,并在 viewDidAppear 期间将其添加回来。它似乎仍然有点hacky,但我更喜欢这个hack然后改变导航栏z-order。
To remove it during viewWillDisappear
在 viewWillDisappear 期间删除它
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[numberBadge removeFromSuperview];
}
回答by MaxMa
It's simple and the best way !
这很简单,也是最好的方法!


MKNumberBadgeView *numberBadge = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(230, -51, 40, 40)];
numberBadge.value = 5;
self.navigationController.navigationBar.layer.zPosition = -1;
[self.view addSubview:numberBadge];
回答by Kiran jadhav
Updated for Swift 3:
为 Swift 3 更新:
use below simple code to add the badge on UIBarButtonItem;
使用下面的简单代码在 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()
//Note: Increase your badge as per you received notification.You have to write your code as per your decided your logic i.e. how to maintain that badge count number in database.
//注意:根据您收到的通知增加您的徽章。您必须根据您决定的逻辑编写代码,即如何在数据库中维护该徽章计数。
Enjoy..!?
享受..!?
回答by Mandar Choudhary
After searching too many solutions I found this best solution for Objective-C
在搜索了太多解决方案后,我找到了 Objective-C 的最佳解决方案
Goto Following Link and download two files "UIBarButtonItem+Badge.h"and "UIBarButtonItem+Badge.m"and add to your project :
转到以下链接并下载两个文件“UIBarButtonItem+Badge.h”和“UIBarButtonItem+Badge.m”并添加到您的项目中:
https://github.com/mikeMTOL/UIBarButtonItem-Badge
https://github.com/mikeMTOL/UIBarButtonItem-Badge
Then import in your class :
然后在您的班级中导入:
#import "UIBarButtonItem+Badge.h"
And write down following line to add badge :
并记下以下行以添加徽章:
self.navigationItem.rightBarButtonItem.badgeValue = @"1"; //your value
Hope it will Work !!!
希望它会奏效!!!
回答by Allan Alves
Extension to add an UIActivityIndicatorView without replacing the UIBarButtonItem.
添加 UIActivityIndicatorView 而不替换 UIBarButtonItem 的扩展。
extension 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({ 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)
}
}
}
is UIActivityIndicatorView }).first
loading?.removeFromSuperview()
let buttonView = view.subviews.first
buttonView?.alpha = 1.0
}
}
}
回答by Syngmaster
Here is a simple Swift 4 solution for it (with some customisation) https://github.com/Syngmaster/BadgedBarButtonItem
这是一个简单的 Swift 4 解决方案(带有一些自定义)https://github.com/Syngmaster/BadgedBarButtonItem
Just drag and drop the class into your project and you can use it like that:
只需将类拖放到您的项目中,您就可以像这样使用它:
//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>
回答by ceiling cat
I know this has been solved already,but I thought I might add what I have discovered to this answer for the sake of completeness.
我知道这已经解决了,但为了完整起见,我想我可能会将我发现的内容添加到这个答案中。
You can also just add MKNumberBadgeViewdirectly to the view for the UIBarButtonItem. Using Monotouch (C#), this is how you get the view for the UIBarButtonItem
您也可以直接添加MKNumberBadgeView到UIBarButtonItem. 使用 Monotouch (C#),这是获取视图的方式UIBarButtonItem
I'm sure it's easy to convert this to Obj-C. You will also need to play around with the Frame for the badge to get it to show up in the right place.
我确信将其转换为 Obj-C 很容易。您还需要调整徽章的 Frame 以使其显示在正确的位置。
This way you wont have to remove/add the view from the navigationbar.
这样您就不必从导航栏中删除/添加视图。

