稍加红点解决方案思路分析。【iOS学习】小红点解决方案思路分析。

些微红点(消息推送提醒)在今日底依次App中几乎无处不在,特别是情之翻新日渐频繁,大量之小红点被排放在各个业务入口。一般的话,小红点主要发生三单利用场景:

小红点(消息推送提醒)在本的逐条App中几乎无处不在,特别是内容之翻新日渐频繁,大量底小红点被排放在各个业务入口。一般的话,小红点主要有三单使用场景:

  • App有新增长的成效提醒用户以
  • 某某一个业已有的模块出功效及的更新
  • 职能产生情之扭转还是作业达成的唤起

App有新增长的效用提醒用户采取

广的随下图所著之QQ消息提示(红点为信数目的唤起),
朋友圈的新回复,店铺上架新品,最新优惠活动提醒等等。

某某一个业已有些模块出功力及之换代

red-dot.png

效能发生内容的浮动还是作业达成之提醒

思路分析

一般性情况下,小红点不是孤立使用的,一码意义要业务的营业涉及多只层级多只入口,所以有些红点需要有明晰的门道导向,而且富含路径树的概念,父路径的小红点为子路径小红点的并集。其次就是是不怎么红点的切实可行显示,以及展示的实际样式。因此,总结一下继得以把小红点的功能模块归纳为有限分外块:
小红点路径监测+事件分发及小红点的UI显示。

常见的按下图所展示之QQ消息提示(红点为信息数目的提拔),
朋友圈的初回复,店铺上架新品,最新优惠活动提醒等等。

有些红点路径监测+事件分发

稍红点所支撑之路格式设计也root.xx.xx,
小红点原则是父节点的小红点为子节点的小红点并集。root啊默认的根本路径。如下图所示,
root.first为子路径, root.second为同级子路径。在纯红点模式下,
root的小红点显示为root.first, root.secondroot.third的并集,同理在数字显示模式下,
root的badge数量为root.first,
root.secondroot.third的badge数量之和。而root.first的badge数量则以为root.first.firstAroot.first.firstB的和。

path.png

微红点的途径监测则是需要提供类似系统KVO的一个Observer,
用来观察路径所对应的小红点的变,并且当子路径的红点发生变化是待逐层分发至每一个父路径。当任意子路径有红点触发事件不时,父路径为待出示红点。而当所有子路径的瑞点工作还散后,父路径的红点才能够免去。

总结一下,小红点路径监测用贯彻下面的接口:

- (void)observePath:(NSString *)keyPath block:(RJBadgeNotificationBlock)block;
- (void)observePath:(NSString *)keyPath badgeView:(nullable id<P365BadgeView>)badgeView block:(nullable RJBadgeNotificationBlock)block;

首先单接口也某被监测路径有红点事件触发后提供block业务处理回调,第二个接口则也当有事件后,在相应的badgeView上显得小红点UI,
这里传出的badgeView可以是一个button, 也得以是一个tab,
因而应该包括富有广义上的UI控件。

小红点的风波触发和散发则要实现如下接口:

+ (void)setBadgeForKeyPath:(NSString *)keyPath;
+ (void)setBadgeForKeyPath:(NSString *)keyPath count:(NSUInteger)count;

+ (void)clearBadgeForKeyPath:(NSString *)keyPath;
+ (void)clearBadgeForKeyPath:(NSString *)keyPath forced:(BOOL)forced;

当App收到服务器推送有新情节更新时,需要针对某路径setBadge,
这边的setBadge会触发上面的observe
block的回调。且如果消息啊多少型,比如不念消息时,还得在setBadge的时添加count属性。若用户点击了信息还是上了某小红点提示的进口后,需要免去小红点消息,并且要Observe的时候绑定了展示小红点的UI控件,也亟需破除该控件上的小红点图标。

正常状况下,如果某个路径下还有子路径有小红点,这个时刻针对该路径clearBadge是应该不起作用的,合理逻辑应该是当子路径的装有小红点都clear掉了晚大人路径自动清除。但如果这个状况下欲强制清除父路径红点,则需以clear方法及加以一个是不是forced清除的参数。

图片 1

稍许红点的UI显示

稍稍红点的UI样式应该包括三栽: 小红点,
数字自从定义的icon或view.
最中心的小红点主要为此当作业入口处,用于内容、功能还是动态更新的提拔。数字小红点则一般用来显示非念消息的数。自定义之icon可以显得准new,
免费,
热门等活动运营的提拔,当然如果用展示更扑朔迷离的UI设计也罢当支持由定义view作为badge的职能。

既然如此可以展示三种植体裁的小红点UI,
那么即使用来一个先行级排序,结合方面的setBadge接口,
我们好想到的规则是如果setBadge时没有安装count, 那么默认就是显示小红点,
如果设置了count,
那么即使展示数字。另外在显示小红点的情况下,如果用户安装了由定义icon那么就算优先展示icon,
按照这个思路,小红点样式的优先级就出去了:
数字之优先级最高,其次是自定义icon, 最后虽然是默认的圈小红点。

对UI,
我们还盼可以定制的,所以对默认的圈小红点应该可以调整其的半径,以及显在控件上针锋相对于右上斗的offset,
而对于数字小红点应该好调整其的书体和文字颜色。另外,如果数字之数值特别酷,应该发生只高上限,比如跨越99晚虽显示省略号。按照上面这些思路分析,我们可抱下面所显示之BadgeView接口:

@protocol RJBadgeView <NSObject>

@required

@property (nonatomic, strong) UILabel *badge;
@property (nonatomic, strong) UIFont  *badgeFont;      // default bold size 9
@property (nonatomic, strong) UIColor *badgeTextColor; // default white color
@property (nonatomic, assign) CGFloat badgeRadius;
@property (nonatomic, assign) CGPoint badgeOffset;     // offset from right-top

- (void)showBadge; // badge with red dot
- (void)hideBadge;

// badge with number, pass zero to hide badge
- (void)showBadgeWithValue:(NSUInteger)value;

@optional

@property (nonatomic, strong) UIView *customView;
/**
 convenient interface:
 create 'cusomView' (UIImageView) using badgeImage
 view's size would simply be set as half of image.
 */
@property (nonatomic, strong) UIImage *badgeImage;

稍微红点显示接口的调用理论及应有由里来点,也就算是利用方调用:

+ (void)setBadgeForKeyPath:(NSString *)keyPath;

之后,

- (void)observePath:(NSString *)keyPath badgeView:(nullable id<P365BadgeView>)badgeView block:(nullable RJBadgeNotificationBlock)block;

眼看边所指定要展示小红点的badgeView上会在聊红点模块内部来调用showBadge.
当用户点击了形小红点的控件后,应该当控件的点击事件里调用clearBadgeForKeyPath来点内部调用hideBadge.
简而言之,就是使用方不待显式的来调用badgeViewshowBadge或者hideBadge.
同理,当使用方调用:

+ (void)setBadgeForKeyPath:(NSString *)keyPath count:(NSUInteger)count;

会见当中调用badgeView的showBadgeWithValue.
当然要要是用方需要在某某控件上(e.g. badgeView ->
UIButton)显示小红点,但是并不需要与某路径关联,只是单纯的亮小红点,那该也得支持[self.button showBadge]的调用。

支撑显得小红点的badgeView应该包括广义上的所有UI控件,
iOS这边控件主要有3生门类: a). UIView b). UIBarButtonItem c).
UITabBarItem,
所以我们得对当下三种恍若分别写一个category来创造小红点UI并显示在控件上,当然就三单category必须要conform上面的RJBadgeView
Protocol:

@interface UIView (RJBadge) <RJBadgeView>
@interface UITabBarItem (RJBadge) <RJBadgeView>
@interface UIBarButtonItem (RJBadge) <RJBadgeView>

red-dot.png

接口优化

参照者的讨论,我们得针对小红点路径进行监察,也就是是如observePath,
类似于系统的KVO监测API, 这边会出下几乎单需要考虑的题目:

  1. 又添加已出keyPath的observe
  2. observe之后在observer退出或释放后忘记unobserve
  3. 初始化小红点模块的复杂度和不畏利度
  4. block回调里面或者的大循环引用问题

对于第一只问题,我们创建一个数据结构RJBadgeInfo,
用来存放小红点的连锁信息,每次添加observe对info进行较,如果已经发生监测则不失去开还添加。

@interface RJBadgeInfo : NSObject

@property (nonatomic, copy,   readonly) NSString                 *keyPath;
@property (nonatomic, weak,   readonly) RJBadgeController        *controller;
@property (nonatomic, copy,   readonly) RJBadgeNotificationBlock block;
@property (nonatomic, strong, readonly) id<RJBadgeView>          badgeView;

@end

亚个问题可以运用从释放的体制来实现observe的自行移除,这样就需拿badgeController作为观察者的成员变量,当observer释放之后badgeController也会放出,那么我们即便在badgeController的
dealloc函数中错过做observe的移除操作。使用方则无需关注何时去移除观察者,当然要确实要超前移除观察者,也足以调用unobservePath接口。

初始化函数生成badgeController并且为observer的分子变量是,最简便与方便的点子就是是被所有NSObject对象通过category添加badgeController变量,这样用户无论需显式去调用alloc方法,只需要self.badgeController即可动态生成badgeController对象。

@interface NSObject (RJBadgeController)

@property (nonatomic, strong) RJBadgeController *badgeController;

@end

在badgeController的get艺术中则是调用RJBadgeController的初始化方法变对象并赋值给self.badgeController变量:

- (RJBadgeController *)badgeController
{
    id controller = objc_getAssociatedObject(self, NSObjectBadgeControllerKey);
    // lazily create the badgeController
    if (nil == controller) {
        controller           = [RJBadgeController controllerWithObserver:self];
        self.badgeController = controller;
    }
    return controller;
}

- (void)setBadgeController:(RJBadgeController *)badgeController 
{
    objc_setAssociatedObject(self, 
                             NSObjectBadgeControllerKey, 
                             badgeController, 
                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

末了一个循环往复引用的问题,在badge的block里面所以参数observer来代替self,
我们针对observer(即self.badgeController的self)进行weak化处理并透过block回调参数传出:

[self.badgeController observePath:@"root.xx" 
                        badgeView:button 
                            block:^(RJViewController *observer, NSDictionary *info) {
    // Use [observer doSomething] instead of [self doSomething] to avoid retain cycle in block
    // key path     -> info[RJBadgePathKey] : badgeContoller所observe的路径
    // badge status -> info[RJBadgeShowKey] : 当前路径所对应的badge是否处于set状态(是否应该显示小红点)
    // badge count  -> info[RJBadgeCountKey]: 当前路径所对应的badge数值(仅在badge为数值模式下有效)
}];

思路分析

方案实现

力排众议talk完了,可以show源码了,完整的小红点解决方案实现源码RJBadgeKit都揭晓到GitHub,
可以直接通过cocoapods, pod ‘RJBadgeKit’集成以。我们来拘禁下实际行使示范:

要我们发出只促销页面,该促销有三三两两只商品参与运动,则促销页面的路子而设置也root.promotion,促销页面内星星点点单商品的途径分别要为root.promotion.item1,
root.promotion.item2.
本需推送小红点消息于用户,在promotion的入口处的button需要出示小红点提示,当用户进入到promotion页面都分别点击了item1和item2后,promotion的小红点提示才没有。

首先我们在RJPromotionViewController里面对promotionButton添加路线的观察者,当该路线为setBadge时候则显示小红点,clearBadge时虽然躲小红点:

[self.badgeController observePath:@"root.promotion" 
                        badgeView:promotionButton 
                            block:^(RJPromotionViewController *observer, 
                                    NSDictionary *info) {
    BOOL hasPromotionItem = [info[RJBadgeShowKey] boolValue];
    [observer setPromotionStatus:hasPromotionItem];
}];

当网络要返回时意识来少数只促销数据(注意路径的格式),则调用:

[RJBadgeController setBadgeForKeyPath:@"root.promotion.item1"];
[RJBadgeController setBadgeForKeyPath:@"root.promotion.item2"];

子路径的小红点状态变化会触发父路径observe的block回调,所以上述两履行代码执行后promotionButton会触发显示小红点。当然如果希望promotionButton不亮小红点,而是展示具体的促销数量,则好直接如下调用:

[RJBadgeController setBadgeForKeyPath:@"root.promotion" count:2];

设promotion item下面还有子路径, 则调用:

[RJBadgeController setBadgeForKeyPath:@"root.promotion.item1" count:5];

在这个情景下,promotionButton上显得的数值(亦即root.promotion路径对应的badge值)为root.promotion.item1和root.promotion.item2及其所有子节点的数值之和。当用户点击查阅了item1和item2后,分别调用clearBadeg方法来排遣小红点:

[RJBadgeController clearBadgeForKeyPath:@"root.promotion.item1"];
[RJBadgeController clearBadgeForKeyPath:@"root.promotion.item2"];

此时父节点root.promotion的badge自动clear,
promotionButton的小红点会自动隐藏。如果要当item1被clear后虽劫持清除root.promotion的badge,
则可以在破除item1后调用:

[RJBadgeController clearBadgeForKeyPath:@"root.promotion" force:YES];

这样就算子节点的badge尚未全部免,父节点也会为胁持clear.

正常情况下非应该去调整用force:YES,
如果非要是调用,可能是路线结构设计不成立了

对于小红点的体裁,
RJBadgeKit可以通过offset来安显示位置,也得以传需要出示的自定义红点icon.
如果欲展示的体裁非常复杂,那呢得一直传入定制的view用来当badge展示:

promotionButton.badgeOffset = CGPointMake(-50, 0); // 调整小红点的显示位置offset, 相对于右上角

[self.promotionButton setBadgeImage:[UIImage imageNamed:@"badgeNew"]]; // 显示自定义的badge icon

[self.promotionButton setCustomView:self.customBadgeView]; // 显示自定义的badge view

下图为RJBadgeKit所对应的Example运行效果,
更详尽的以示例及拥有支持的接口方法及属性设置好参考Example工程。

demo.gif

最后再次贴一下源码地址:
https://github.com/RylanJIN/RJBadgeKit,
在采取中生出遇到什么问题要么优化建议欢迎留言PR,
如果RJBadgeKit的实现方案对您有所助及启迪,也不妨让个Star鼓励下。

万般状态下,小红点不是孤立使用的,一桩职能要业务的运营涉及多独层级多个入口,所以小红点需要有明晰的途径导向,而且含有路径树的定义,父路径的小红点为子路径小红点的并集。其次就是是稍微红点的求实显示,以及显的具体样式。因此,总结一下晚好管小红点的功能模块归纳为片雅块:
小红点路径监测+事件分发及小红点的UI显示。

聊红点路径监测+事件分发

稍稍红点所支持之门道格式设计也罢root.xx.xx,
小红点原则是父节点的小红点为子节点的小红点并集。root也默认的清路径。如下图所示,
root.first为子路径, root.second为同级子路径。在纯红点模式下,
root的小红点显示为root.first,
root.second和root.third的并集,同理在数字显示模式下,
root的badge数量为root.first,
root.second和root.third的badge数量之和。而root.first的badge数量则还要也root.first.firstA和root.first.firstB的与。

图片 2

path.png

稍稍红点的不二法门监测则是需要提供类似系统KVO的一个Observer,
用来察看路径所对应的小红点的转变,并且当子路径的红点发生变化是得逐层分发至各国一个父路径。当任意子路径有红点触发事件频仍,父路径也待出示红点。而当所有子路径的吉点事情都辟后,父路径的瑞点才会除掉。

小结一下,小红点路径监测需要贯彻下面的接口:

– (void)observePath:(NSString *)keyPath
block:(RJBadgeNotificationBlock)block;

– (void)observePath:(NSString *)keyPath badgeView:(nullable
id)badgeView block:(nullable RJBadgeNotificationBlock)block;

第一独接口也某某被监测路径有红点事件触发后提供block业务处理回调,第二单接口则也当有事变后,在相应的badgeView上展示小红点UI,
这里传出的badgeView可以是一个button, 也足以是一个tab,
因而应该包括有广义上的UI控件。

稍微红点的轩然大波触发和散发则需要实现如下接口:

+ (void)setBadgeForKeyPath:(NSString *)keyPath;

+ (void)setBadgeForKeyPath:(NSString *)keyPath
count:(NSUInteger)count;

+ (void)clearBadgeForKeyPath:(NSString *)keyPath;

+ (void)clearBadgeForKeyPath:(NSString *)keyPath forced:(BOOL)forced;

当App收到服务器推送有新情节更新时,需要针对某个路径setBadge,
这边的setBadge会触发上面的observe
block的回调。且要消息呢数型,比如不念消息时,还欲在setBadge的下添加count属性。若用户点击了音还是入了某个小红点提示的进口后,需要破除小红点消息,并且只要Observe的时刻绑定了展示小红点的UI控件,也欲免去该控件上的小红点图标。

健康状态下,如果有路径下还有子路径有小红点,这个时对该路径clearBadge是理所应当不从效的,合理逻辑应该是当子路径的富有小红点都clear掉了继大路径自动清除。但倘若此情下得强制清除父路径红点,则用以clear方法上加以一个是不是forced清除的参数。

有点红点的UI显示

微红点的UI样式应该包括三种: 小红点, 数字与打定义之icon或view.
最中心的小红点主要为此当作业入口处,用于内容、功能要动态更新的唤起。数字小红点则一般用来展示非念消息的数量。自定义之icon可以显得准new,
免费,
热门顶移动运营的唤醒,当然要要出示更扑朔迷离的UI设计啊应支持自定义view作为badge的功用。

既可以来得三种植体裁的小红点UI,
那么就是需要发出一个优先级排序,结合地方的setBadge接口,
我们得以想到的规则是使setBadge时没有安装count, 那么默认就是亮小红点,
如果设置了count,
那么就算显示数字。另外当显示小红点的气象下,如果用户安装了于定义icon那么就优先展示icon,
按照这个思路,小红点样式的预级就出来了:
数字的优先级最高,其次是打定义icon, 最后虽然是默认的环小红点。

对于UI,
我们且期待得以定制的,所以对于默认的环小红点应该可以调整其的半径,以及显在控件上相对于右上较量的offset,
而对于数字小红点应该可以调整其的书和仿颜色。另外,如果数字的数值特别大,应该生出个高上限,比如跨越99晚便显示省略号。按照上面这些思路分析,我们得获取下面所出示之BadgeView接口:

@protocol RJBadgeView @required

@property (nonatomic, strong) UILabel *badge;

@property (nonatomic, strong) UIFont  *badgeFont;      // default bold
size 9

@property (nonatomic, strong) UIColor *badgeTextColor; // default white
color

@property (nonatomic, assign) CGFloat badgeRadius;

@property (nonatomic, assign) CGPoint badgeOffset;    // offset from
right-top

– (void)showBadge; // badge with red dot

– (void)hideBadge;

// badge with number, pass zero to hide badge

– (void)showBadgeWithValue:(NSUInteger)value;

@optional

@property (nonatomic, strong) UIView *customView;

/**

convenient interface:

create ‘cusomView’ (UIImageView) using badgeImage

view’s size would simply be set as half of image.

*/

@property (nonatomic, strong) UIImage *badgeImage;

有点红点显示接口的调用理论及应当由其中来点,也尽管是运方调用:

+ (void)setBadgeForKeyPath:(NSString *)keyPath;

之后,

– (void)observePath:(NSString *)keyPath badgeView:(nullable
id)badgeView block:(nullable RJBadgeNotificationBlock)block;

及时边所指定要出示小红点的badgeView上会在稍微红点模块内部来调用showBadge.
当用户点击了形小红点的控件后,应该当控件的点击事件里调用clearBadgeForKeyPath来点内部调用hideBadge.
简而言之,就是使用方不需要显式的来调用badgeView的showBadge或者hideBadge.
同理,当使用方调用:

+ (void)setBadgeForKeyPath:(NSString *)keyPath
count:(NSUInteger)count;

会在里头调用badgeView的showBadgeWithValue.
当然如果要是用方需要以某控件上(e.g. badgeView ->
UIButton)显示小红点,但是并不需要与某个路径关联,只是独自的示小红点,那应该也急需支持[self.button
showBadge]的调用。

支持显得小红点的badgeView应该包括广义上之所有UI控件,
iOS这边控件主要有3特别项目: a). UIView b). UIBarButtonItem c).
UITabBarItem,
所以我们得以针对立即三种植类似分别写一个category来创造小红点UI并出示在控件上,当然就三个category必须使conform上面的RJBadgeView
Protocol:

@interface UIView (RJBadge) @interface UITabBarItem (RJBadge) @interface
UIBarButtonItem (RJBadge)

接口优化

参照者的议论,我们得对小红点路径进行督察,也就算是设observePath,
类似于系统的KVO监测API, 这边会时有发生下面几乎独需要考虑的问题:

再也添加已发生keyPath的observe

observe之后于observer退出或自由后忘记unobserve

初始化小红点模块的复杂度和就利度

block回调里面可能的轮回引用问题

对此第一个问题,我们创建一个数据结构RJBadgeInfo,
用来存放在小红点的连带信息,每次添加observe对info进行比较,如果既生监测则免错过做重新添加。

@interface RJBadgeInfo : NSObject

@property (nonatomic, copy,  readonly) NSString               
*keyPath;

@property (nonatomic, weak,  readonly) RJBadgeController       
*controller;

@property (nonatomic, copy,  readonly) RJBadgeNotificationBlock block;

@property (nonatomic, strong, readonly) id          badgeView;

@end

亚个问题得以运用从释放的体制来实现observe的机动移除,这样即便需拿badgeController作为观察者的成员变量,当observer释放之后badgeController也会放出,那么我们不怕在badgeController的 
dealloc函数中失去举行observe的移除操作。使用方则无需关注何时去移除观察者,当然如果真的用超前移除观察者,也可调用unobservePath接口。

初始化函数生成badgeController并且以observer的积极分子变量是,最简单易行与便利的法子尽管是叫有NSObject对象通过category添加badgeController变量,这样用户无论需显式去调用alloc方法,只需要self.badgeController即可动态生成badgeController对象。

@interface NSObject (RJBadgeController)

@property (nonatomic, strong) RJBadgeController *badgeController;

@end

在badgeController的get方法中则是调用RJBadgeController的初始化方法变对象并赋值给self.badgeController变量:

– (RJBadgeController *)badgeController

{

id controller = objc_getAssociatedObject(self,
NSObjectBadgeControllerKey);

// lazily create the badgeController

if (nil == controller) {

controller          = [RJBadgeController controllerWithObserver:self];

self.badgeController = controller;

}

return controller;

}

– (void)setBadgeController:(RJBadgeController *)badgeController

{

objc_setAssociatedObject(self,

NSObjectBadgeControllerKey,

badgeController,

OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

最终一个循环引用的题材,在badge的block里面用参数observer来代替self,
我们本着observer(即self.badgeController的self)进行weak化处理并经block回调参数传出:

[self.badgeController observePath:@”root.xx”

badgeView:button

block:^(RJViewController *observer, NSDictionary *info) {

// Use [observer doSomething] instead of [self doSomething] to avoid
retain cycle in block

// key path    -> info[RJBadgePathKey] :
badgeContoller所observe的路径

// badge status -> info[RJBadgeShowKey] :
当前路线所对应的badge是否处于set状态(是否合宜出示小红点)

// badge count  -> info[RJBadgeCountKey]:
当前路所对应之badge数值(仅在badge为数值模式下中)

}];

方案实现

辩论talk完了,可以show源码了,完整的小红点解决方案实现源码RJBadgeKit已经宣告暨GitHub,
可以一直通过cocoapods, pod ‘RJBadgeKit’集成应用。我们来拘禁下实际应用示范:

要是我们发出个促销页面,该促销有有限独商品与活动,则促销页面的路线而安装为root.promotion,促销页面内片只商品之路子分别要为root.promotion.item1,
root.promotion.item2.
现行亟待推送小红点消息给用户,在promotion的入口处的button需要展示小红点提示,当用户进入到promotion页面还分别点击了item1和item2后,promotion的小红点提示才消失。

第一我们当RJPromotionViewController里面对promotionButton添加路的观察者,当该路线为setBadge时候则显示小红点,clearBadge时虽然躲小红点:

[self.badgeController observePath:@”root.promotion”

badgeView:promotionButton

block:^(RJPromotionViewController *observer,

NSDictionary *info) {

BOOL hasPromotionItem = [info[RJBadgeShowKey] boolValue];

[observer setPromotionStatus:hasPromotionItem];

}];

当网络要返回时意识来点儿个促销数据(注意路径的格式),则调用:

[RJBadgeController setBadgeForKeyPath:@”root.promotion.item1″];

[RJBadgeController setBadgeForKeyPath:@”root.promotion.item2″];

子路径的小红点状态变化会触发父路径observe的block回调,所以上述两行代码执行后promotionButton会触发显示小红点。当然如果指望promotionButton不示小红点,而是展示具体的促销数量,则可以直接如下调用:

[RJBadgeController setBadgeForKeyPath:@”root.promotion” count:2];

倘promotion item下面还有子路径, 则调用:

[RJBadgeController setBadgeForKeyPath:@”root.promotion.item1″
count:5];

于此情形下,promotionButton上展示的数值(亦即root.promotion路径对应之badge值)为root.promotion.item1和root.promotion.item2及其所有子节点的数值之和。当用户点击查看了item1和item2后,分别调用clearBadeg方法来排除小红点:

[RJBadgeController clearBadgeForKeyPath:@”root.promotion.item1″];

[RJBadgeController clearBadgeForKeyPath:@”root.promotion.item2″];

这父节点root.promotion的badge自动clear,
promotionButton的小红点会自动隐藏。如果指望当item1被clear后就是强制清除root.promotion的badge,
则可以以打消item1后调用:

[RJBadgeController clearBadgeForKeyPath:@”root.promotion” force:YES];

这样就子节点的badge尚未全部排,父节点也会见给强制clear.

正规情况下未应去调整用force:YES,
如果非要是调用,可能是路结构设计不成立了

对小红点的样式,
RJBadgeKit可以透过offset来安显示位置,也得传需要出示的自定义红点icon.
如果需要展示的样式非常复杂,那也可直接传入定制的view用来当badge展示:

promotionButton.badgeOffset = CGPointMake(-50, 0); //
调整小红点的展示位置offset, 相对于右上比

[self.promotionButton setBadgeImage:[UIImage
imageNamed:@”badgeNew”]]; // 显示自定义的badge icon

[self.promotionButton setCustomView:self.customBadgeView]; //
显示自定义之badge view

产图也RJBadgeKit所对应之Example运行效果,
更详尽的利用示例及持有支持之接口方法及性质设置可以参考Example工程。

图片 3

demo.gif

相关文章

admin

网站地图xml地图