小红点解决方案思路分析。【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

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注