更新日志

  • 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.


概述

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

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

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

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

WZLBadge还有以下优点:

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

我们还是先看两张示例图片吧:


分析

想要使得实现出来的badge接口调用方便,我采用的是对UIView做category的方式,接口统一为实例方法。通过这种方式,可以给任意的UIView及其子类添加badge,而且接口简单。接口应该类似于这样:

1
[someView showBadgeWithStyle:WBadgeStyleRedDot value:0 animationType:WBadgeAnimTypeShake];

现实往往是这样的,使用者使用起来越简单,接口提供方就需要做的越多。我们知道,小红点应该具有多个属性,比如大小、背景颜色、文字颜色等。想让badge具有更强的可定制性,就需要开放这些丰富的属性。那么问题来了,category中理论上只能添加方法,无法添加属性。这时候就需要一些运行时runtime方面的技巧了。我们可以在运行时为UIView添加属性,需要使用到的两个runtime api为:

1
2
OBJC_EXPORT id objc_getAssociatedObject(id objectconst void *key)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

1
2
OBJC_EXPORT void objc_setAssociatedObject(id objectconst void *key, id value, objc_AssociationPolicy policy)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

例如,假设我们现在想给UIView动态添加badgeBgColor属性,用来操纵badge角标的背景色“

1
2
3
4
- (UIColor *)badgeBgColor//getter
{
    return objc_getAssociatedObject(self, &badgeBgColorKey);
}

1
2
3
4
- (void)setBadgeBgColor:(UIColor *)badgeBgColor//setter
{
    objc_setAssociatedObject(self, &badgeBgColorKey, badgeBgColor, OBJC_ASSOCIATION_RETAIN);
}

关于动态添加属性的知识在这里就不具体展开了,想要了解更多的可以参考我的这篇《iOS运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)》。这个知识点也是本文开源的WZLBadge的核心点,实际上这也是大多数开源工具的常规做法。另外,对于WZLBadge的其他技术细节在这里就不再细述,具体可以到文章末尾处转去Github查看。


使用方法

由于WZLBadge采用对UIView扩展category的方式,因此,所有的UIView及其继承子类(UIControl等)都可以无缝使用,当前版本开放的接口主要有以下几个:

1
2
3
4
/**
 *  show badge with red dot style and WBadgeAnimTypeNone by default.
 */
- (void)showBadge;

1
2
3
4
5
6
7
8
/**
 *  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;

1
2
3
4
/**
 *  clear badge
 */
- (void)clearBadge;


源代码分享

我将源代码托管在github上,我个人希望WZLBadge能不断优化成为iOS平台上推送红点的终极解决方案,如果你感兴趣,我非常欢迎你一起加入让WZLBadge变得更好。有什么问题或者建议请留言或者在github提issue。

此外,希望你能在github上Fellow我,并且对WZLBadge进行star/fork/watch,接下来我的更新会直接通知到你^^。

github地址:WZLBadge (https://github.com/weng1250/WZLBadge)

from: http://www.cnblogs.com/wengzilin/p/4633937.html

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

  1. Cocoapods系列教程(二)——开源主义接班人

    原文地址:Cocoapods系列教程(二)--开源主义接班人 引言 在写该博客的时候,博主刚看到一个问题:"那些头衔只是看起来很厉害,实际不难获得?".然后有个神回复写到:&quo ...

  2. MATLABSTM32CubeMX联合开发系列——不用手写一行代码就能实现CAN通讯

    MATLAB&STM32CubeMX联合开发系列--不用手写一行代码就能实现CAN通讯 从第一次搭建好MATLAB和STM32CubeMX的联合开发环境有一段时间了,之前已经发布了两个实例分享 ...

  3. java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...

    我们在做小程序开发时,消息推送是不可避免的.今天就来教大家如何实现小程序消息推送的后台和前台开发.源码会在文章末尾贴出来. 其实我之前有写过一篇:<springboot实现微信消息推送,java ...

  4. 【script】15行Python代码实现免费发送手机短信推送消息功能(twilio)

    实现的功能 通过代码定时给手机推送短信,短信内容可以自定义文字,当然你也可以去别的网站爬取每日心灵鸡汤,天气预报或其它信息进行推送. 本文主要讲如何实现发送短信的功能,全部代码只用15行. 首先贴出实 ...

  5. 论文绘图神器来了:哈佛博士后开源一行代码绘制不同期刊格式图表

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:量子位 AI博士笔记系列推荐 周志华<机器学习>手推 ...

  6. 首次开源 一行代码中英文语音识别、合成、翻译核心功能

    导读 要说生活里最常见的 AI 应用场景,语音合成与识别当属大家最为耳熟能详的场景之一了. 寻常到平时地图导航的播报.微信语音转文字.手机语音输入,以及小度智能音箱,都离不开语音技术的加持. 语音技术 ...

  7. Go语言150行代码搞定苹果Apns高并发推送

    苹果消息推送Apns是每个apple app必须面对的坎.目前捣腾的小项目需要定时向所有用户推送消息.之前使用python第三方库pyapns实现,结果运行一段时间发现内存消耗很高,而且推送不稳定,经 ...

  8. uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)

    你懂的,又是项目用到了,作为程序猿义无反顾需要定时 "进化" ,硬头皮去写,虽然曾经作为android开发者写了很多的推送,但是uniapp的推送也是有所差异的,记录一下,以后留用 ...

  9. 【python】13行代码教你实现对微信进行推送消息

    前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ Python居然可以实现给QQ邮箱.企业微信.微信等等软件推送消息!! 那么今天咱们就来实现一下Python直接给微信推送消息 ...

最新文章

  1. phonegap 2.7 ios配置安装详细教程(2.9通用)
  2. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)...
  3. MAVEN的使用入门
  4. Python 多进程、多线程启动
  5. 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
  6. ISO 5 Lecture for Micro-Macro Interactions
  7. Nginx: 413 Request Entity Too Large Error and Solu
  8. mysql用大白话解释_Java基础--2021Java面试题系列教程--大白话解读
  9. 在Scala中设置&()方法
  10. python更换tkinter图标样式
  11. linux shell 脚本中变量截取
  12. Linux创翼拨号上网,创翼客户端下载(网络拨号工具) v4.11.4.731 最新版_数码资源网...
  13. livereload(自动刷新)
  14. Keil 5模块化编程详细步骤
  15. 3章 RxJava操作符
  16. android 图片 3d 动画,DEMO:transition3d、运用动画实现图片3d翻转效果
  17. EUI学习之DataGroup与List
  18. Jupyter notebook使用类错误提示 takes no arguments
  19. 中文常用停用词表(哈工大停用词表、百度停用词表
  20. JAVA最佳学习方法

热门文章

  1. 【Python】url基础:网络爬虫技术
  2. 关于HTTP_CLIENT_IP,HTTP_X_FORWAR
  3. 华为诺亚方舟实验室主任李航:神经符号处理开启自然语言处理新篇章
  4. C语言结构体-大小,对齐,填充,使用及其他
  5. Spring Cloud【Finchley】-01服务提供者与服务消费者
  6. Linux-手动释放linux内存cache
  7. 常用的20个正则表达式
  8. 信息提醒之对话框(AlertDialog + ProgressDialog)-更新中
  9. C语言遥控器程序,红外遥控
  10. 图像归一化处理 相同像素_图像处理学习笔记(九)——灰度直方图及其均衡化(理论篇)...