如何在UIBarbutton项目上添加徽章?

| 嗨,朋友是iPhone开发的新手。我很难在右侧的UIBarbutton项上添加徽章值。我已经尝试过,但无法解决此问题。谁能帮我。 提前致谢!     
已邀请:
我知道这篇文章已经很老了,但在iOS7上,MKNumberBadgeView的外观与标签栏项目徽章设计并不完全匹配。 我找到了继承UIBarButtonItem的另一个组件,并且做得很好: https://github.com/TanguyAladenise/BBBadgeBarButtonItem 希望这可以帮助像我这样的其他iOS7开发人员     
最后,我找到了在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;
谢谢。     
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\";
    
我做了类似于MaxMa的操作,但是我只是继续将徽章直接添加到self.navigationController.navigationBar中。
MKNumberBadgeView *numberBadge = [[MKNumberBadgeView alloc] initWithFrame:CGRectMake(35, 0, 40, 40)];
numberBadge.value = 1;

[self.navigationController.navigationBar addSubview:numberBadge];
只需确保在viewWillDisappear期间将其从子视图中删除,然后在viewDidAppear期间将其重新添加即可。似乎还是有点hacky,但是我对这种hack感到更自在,然后更改了导航栏的z顺序。 在viewWillDisappear中删除它
- (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 
希望它能工作!     
在不替换UIBarButtonItem的情况下添加UIActivityIndi​​catorView的扩展。 扩展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)
        }

    }

}
    

要回复问题请先登录注册