Base functions are completed, which is able to meet most of requirements.html
今天咱们来实现一个在iOS中让人又爱又恨的推送“小红点”WZLBadge。那什么是badge呢?当后台有数据更新须要让用户知道时,在按钮或者其余控件上显示一个“小红点”提醒用户。注意,这里的“小红点”仅仅是泛指,实际的视图能够天马行空,在这个版本中咱们先实现如下几种:git
为了让小红点显示后更加醒目,在这个版本中我又实现了三种不一样的状态动画(status animation):github
WZLBadge还有如下优势:编程
咱们仍是先看两张示例图片吧:
api
想要使得实现出来的badge接口调用方便,我采用的是对UIView作category的方式,接口统一为实例方法。经过这种方式,能够给任意的UIView及其子类添加badge,并且接口简单。接口应该相似于这样:工具
[someView showBadgeWithStyle:WBadgeStyleRedDot value:0 animationType:WBadgeAnimTypeShake];
现实每每是这样的,使用者使用起来越简单,接口提供方就须要作的越多。咱们知道,小红点应该具备多个属性,好比大小、背景颜色、文字颜色等。想让badge具备更强的可定制性,就须要开放这些丰富的属性。那么问题来了,category中理论上只能添加方法,没法添加属性。这时候就须要一些运行时runtime方面的技巧了。咱们能够在运行时为UIView添加属性,须要使用到的两个runtime api为:字体
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
例如,假设咱们如今想给UIView动态添加badgeBgColor属性,用来操纵badge角标的背景色“优化
- (UIColor *)badgeBgColor//getter { return objc_getAssociatedObject(self, &badgeBgColorKey); }
- (void)setBadgeBgColor:(UIColor *)badgeBgColor//setter { objc_setAssociatedObject(self, &badgeBgColorKey, badgeBgColor, OBJC_ASSOCIATION_RETAIN); }
关于动态添加属性的知识在这里就不具体展开了,想要了解更多的能够参考个人这篇《iOS运行时runtime初探(强制获取并修改私有变量,强制增长及修改私有方法等)》。这个知识点也是本文开源的WZLBadge的核心点,实际上这也是大多数开源工具的常规作法。另外,对于WZLBadge的其余技术细节在这里就再也不细述,具体能够到文章末尾处转去Github查看。动画
使用方法ui
因为WZLBadge采用对UIView扩展category的方式,所以,全部的UIView及其继承子类(UIControl等)均可以无缝使用,当前版本开放的接口主要有如下几个:
/** * show badge with red dot style and WBadgeAnimTypeNone by default. */ - (void)showBadge;
/** * showBadge * * @param style WBadgeStyle type * @param value (if 'style' is WBadgeStyleRedDot or WBadgeStyleNew, this value will be ignored. In this case, any value will be ok.) * @param aniType */ - (void)showBadgeWithStyle:(WBadgeStyle)style value:(NSInteger)value animationType:(WBadgeAnimType)aniType;
/** * clear badge */ - (void)clearBadge;
我将源代码托管在github上,我我的但愿WZLBadge能不断优化成为iOS平台上推送红点的终极解决方案,若是你感兴趣,我很是欢迎你一块儿加入让WZLBadge变得更好。有什么问题或者建议请留言或者在github提issue。
此外,但愿你能在github上Fellow我,而且对WZLBadge进行star/fork/watch,接下来个人更新会直接通知到你^^。
github地址:WZLBadge (https://github.com/weng1250/WZLBadge)
原创文章,转载请注明 编程小翁@博客园,邮件zilin_weng@163.com,欢迎各位与我在C/C++/Objective-C/机器视觉等领域展开交流!