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
- 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.
- Slight adjustment for code structure to fit future extension.
- 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 object , const void *key)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
|
1
2
|
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角标的背景色“
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)相关推荐
- Cocoapods系列教程(二)——开源主义接班人
原文地址:Cocoapods系列教程(二)--开源主义接班人 引言 在写该博客的时候,博主刚看到一个问题:"那些头衔只是看起来很厉害,实际不难获得?".然后有个神回复写到:&quo ...
- MATLABSTM32CubeMX联合开发系列——不用手写一行代码就能实现CAN通讯
MATLAB&STM32CubeMX联合开发系列--不用手写一行代码就能实现CAN通讯 从第一次搭建好MATLAB和STM32CubeMX的联合开发环境有一段时间了,之前已经发布了两个实例分享 ...
- java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...
我们在做小程序开发时,消息推送是不可避免的.今天就来教大家如何实现小程序消息推送的后台和前台开发.源码会在文章末尾贴出来. 其实我之前有写过一篇:<springboot实现微信消息推送,java ...
- 【script】15行Python代码实现免费发送手机短信推送消息功能(twilio)
实现的功能 通过代码定时给手机推送短信,短信内容可以自定义文字,当然你也可以去别的网站爬取每日心灵鸡汤,天气预报或其它信息进行推送. 本文主要讲如何实现发送短信的功能,全部代码只用15行. 首先贴出实 ...
- 论文绘图神器来了:哈佛博士后开源一行代码绘制不同期刊格式图表
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:量子位 AI博士笔记系列推荐 周志华<机器学习>手推 ...
- 首次开源 一行代码中英文语音识别、合成、翻译核心功能
导读 要说生活里最常见的 AI 应用场景,语音合成与识别当属大家最为耳熟能详的场景之一了. 寻常到平时地图导航的播报.微信语音转文字.手机语音输入,以及小度智能音箱,都离不开语音技术的加持. 语音技术 ...
- Go语言150行代码搞定苹果Apns高并发推送
苹果消息推送Apns是每个apple app必须面对的坎.目前捣腾的小项目需要定时向所有用户推送消息.之前使用python第三方库pyapns实现,结果运行一段时间发现内存消耗很高,而且推送不稳定,经 ...
- uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)
你懂的,又是项目用到了,作为程序猿义无反顾需要定时 "进化" ,硬头皮去写,虽然曾经作为android开发者写了很多的推送,但是uniapp的推送也是有所差异的,记录一下,以后留用 ...
- 【python】13行代码教你实现对微信进行推送消息
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ Python居然可以实现给QQ邮箱.企业微信.微信等等软件推送消息!! 那么今天咱们就来实现一下Python直接给微信推送消息 ...
最新文章
- phonegap 2.7 ios配置安装详细教程(2.9通用)
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)...
- MAVEN的使用入门
- Python 多进程、多线程启动
- 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
- ISO 5 Lecture for Micro-Macro Interactions
- Nginx: 413 Request Entity Too Large Error and Solu
- mysql用大白话解释_Java基础--2021Java面试题系列教程--大白话解读
- 在Scala中设置&()方法
- python更换tkinter图标样式
- linux shell 脚本中变量截取
- Linux创翼拨号上网,创翼客户端下载(网络拨号工具) v4.11.4.731 最新版_数码资源网...
- livereload(自动刷新)
- Keil 5模块化编程详细步骤
- 3章 RxJava操作符
- android 图片 3d 动画,DEMO:transition3d、运用动画实现图片3d翻转效果
- EUI学习之DataGroup与List
- Jupyter notebook使用类错误提示 takes no arguments
- 中文常用停用词表(哈工大停用词表、百度停用词表
- JAVA最佳学习方法
热门文章
- 【Python】url基础:网络爬虫技术
- 关于HTTP_CLIENT_IP,HTTP_X_FORWAR
- 华为诺亚方舟实验室主任李航:神经符号处理开启自然语言处理新篇章
- C语言结构体-大小,对齐,填充,使用及其他
- Spring Cloud【Finchley】-01服务提供者与服务消费者
- Linux-手动释放linux内存cache
- 常用的20个正则表达式
- 信息提醒之对话框(AlertDialog + ProgressDialog)-更新中
- C语言遥控器程序,红外遥控
- 图像归一化处理 相同像素_图像处理学习笔记(九)——灰度直方图及其均衡化(理论篇)...