利用runtime為導(dǎo)航欄UIBarButtonItem添加Badge,為category添加屬性

項(xiàng)目需求需要在導(dǎo)航欄按鈕上顯示小紅點(diǎn),但按鈕使用的是系統(tǒng)原生的UIBarbuttonItem,重寫控件不太可能,于是利用category的方式為其添加紅點(diǎn)并顯示。


紅點(diǎn)顯示效果.png

具體實(shí)現(xiàn)是利用關(guān)聯(lián),首先需要 #import <objc/runtime.h>

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)

利用關(guān)聯(lián),自己書寫屬性的setter和getter方法,可以向category中添加屬性

NSString *const ZYBarButtonItem_badgeKey = @"ZYBarButtonItem_badgeKey";

@property (strong, nonatomic) UIView *badge;

- (UIView *)badge
{
    UIView *badge = (UIView *)objc_getAssociatedObject(self, &ZYBarButtonItem_badgeKey);
    if (!badge) {
        badge = [[UIView alloc] init];
        [self setBadge:badge];
        [self initBadge];
        [self.customView addSubview:badge];
    }
    return badge;
}

- (void)setBadge:(UIView *)badge
{
    objc_setAssociatedObject(self, &ZYBarButtonItem_badgeKey, badge, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

初始化badge相關(guān)屬性:
- (void)initBadge
{
UIView *superview = nil;

    if (self.customView) {
        superview = self.customView;
        superview.clipsToBounds = NO;
    } else if ([self respondsToSelector:@selector(view)] && [(id)self view]) {
        superview = [(id)self view];
    }
    [superview addSubview:self.badge];

    // 默認(rèn)設(shè)置
    self.badgeColor = [UIColor redColor];
    self.badgeSize = 8;
    self.badgeOriginX = 14;
    self.badgeOriginY = 12;
    self.badge.hidden = YES;
}

在提供給外部使用的屬性中,當(dāng)修改了默認(rèn)屬性時(shí) 需要刷新界面,如修改badge顏色屬性badgeColor時(shí),在其setter方法中調(diào)用刷新方法:
- (void)setBadgeColor:(UIColor *)badgeColor
{
objc_setAssociatedObject(self, &LYBarButtonItem_badgeColorKey, badgeColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if (self.badge) {
[self refreshBadge];
}
}

刷新方法:
- (void)refreshBadge
{
self.badge.frame = (CGRect){self.badgeOriginX,self.badgeOriginY,self.badgeSize,self.badgeSize};
self.badge.backgroundColor = self.badgeColor;
self.badge.layer.cornerRadius = self.badgeSize/2;
}

至此,項(xiàng)目需求的小紅點(diǎn)只需要通過控制badge的顯示或隱藏即可達(dá)到。若有其他需求類似顯示數(shù)字,也可通過類似方法添加屬性來達(dá)成。

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,694評論 4 61
  • 一個(gè)好朋友買了一套房子,讓我?guī)退鲈O(shè)計(jì),說是讓幫忙隨便懟懟,但是既然答應(yīng)做了,就不能隨便懟,還開始找了一些意向圖給...
    楊pure閱讀 226評論 0 0
  • 注:這篇文章是基于cs231n 的lecture 3. 數(shù)據(jù) 我們的數(shù)據(jù)如Fig 0所示 上邊的圖片是模型的輸入,...
    jiraiyafuhui閱讀 5,235評論 0 1
  • 文/my彩色沙漠 如果全世界宣布愛你,你一定會高興地瘋掉。那如果全世界否定你,你又會怎樣?很多人會失落到谷底里。 ...
    my彩色沙漠閱讀 271評論 2 7
  • 只要管理層能夠不拘泥于企業(yè)原有的核心競爭力,以新的視角看待變化,就能夠抓住未來增長趨勢的信號。摘自 陳春花《激活個(gè)體》
    靜如癱瘓_動若癲癇閱讀 283評論 0 0

友情鏈接更多精彩內(nèi)容