【原】Github系列之二:开源 一行代码实现多形式多动画的推送小红点WZLBadge(iOS)

更新日志

  • V1.2 2015.09.25 1.UITabBarItem badge is supproted; 2.Enable change badge properties when badge is showing; 3.Other code optimization.
  • V1.1 2015.08.12
  1. UIBarButtonItem badge is supported. UIBarButtonItem is kind of NSObject and its displayed view is invisiable. This version makes usage of UIBarButtonItem badge as to UIView.
  2. Slight adjustment for code structure to fit future extension.
  3. Other code optimization.
  • V1.0 at 2015.06.16

  Base functions are completed, which is able to meet most of requirements.html


 

 

概述

今天咱们来实现一个在iOS中让人又爱又恨的推送“小红点”WZLBadge。那什么是badge呢?当后台有数据更新须要让用户知道时,在按钮或者其余控件上显示一个“小红点”提醒用户。注意,这里的“小红点”仅仅是泛指,实际的视图能够天马行空,在这个版本中咱们先实现如下几种:git

  • 小红点
  • 红底白字“new”
  • 红底白字数字

为了让小红点显示后更加醒目,在这个版本中我又实现了三种不一样的状态动画(status animation):github

  • 心脏跳动效果(WBadgeAnimTypeScale)
  • 呼吸灯效果(WBadgeAnimTypeBreathe)
  • 横向抖动(WBadgeAnimTypeShake)
  • 静止状态(WBadgeAnimTypeNone, 默认)

WZLBadge还有如下优势:编程

  • 支持横竖屏
  • 支持iOS5~iOS8
  • 容许高度定制化,包括“红点”的背景颜色,文字(字体大小、颜色),位置等

 

咱们仍是先看两张示例图片吧:
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/机器视觉等领域展开交流!

相关文章
相关标签/搜索