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