前些日子,项目中用到一个倒计时读秒的功能。其实实现起来很简单,就是通过改变 label 的transform。经过封装一句代码就可以引入项目中。

/**

@param number 倒计时起始时间

@param endTitle 倒计时结束字符串

@param beginCount 倒计时开始回调

@param finishCount 倒计时结束回调

*/

[GGCountDownLabel gg_countDownWithBeginNumber:5 endTitle:@"第一个控制器" begin:nil finished:nil];

先看下效果:

读秒倒计时.gif

因为代码很简单,所以就直接贴出来了

.h 文件中的代码

#import

typedef void(^countDownBeginCallBack)();

typedef void(^countDownFinishedCallBack)();

@interface GGCountDownLabel : UILabel

/**

开始倒计时

@param number 倒计时起始时间

@param endTitle 倒计时结束字符串

@param beginCount 倒计时开始回调

@param finishCount 倒计时结束回调

*/

+ (instancetype)gg_countDownWithBeginNumber:(NSInteger)number

endTitle:(NSString *)endTitle

begin:(countDownBeginCallBack)beginCount

finished:(countDownFinishedCallBack)finishCount;

/**

隐藏

*/

+ (void)gg_hidden;

@end

.m文件中的代码

#import "GGCountDownLabel.h"

#import "AppDelegate.h"

#define GGScreenWith [UIScreen mainScreen].bounds.size.width

#define GGScreenHeight [UIScreen mainScreen].bounds.size.height

#define GGAppDelegate ((AppDelegate *)([UIApplication sharedApplication].delegate))

@interface GGCountDownLabel ()

@property (nonatomic, assign) NSInteger number;

@property (nonatomic, copy) NSString *endTitle;

@property (nonatomic, copy) countDownBeginCallBack beginCount;

@property (nonatomic, copy) countDownFinishedCallBack finishCount;

@end

@implementation GGCountDownLabel

BOOL isAnimating;

/** 单例初始化 */

+ (instancetype)shareCountDownLabel

{

static GGCountDownLabel *_instance;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instance = [[GGCountDownLabel alloc] init];

});

return _instance;

}

+ (instancetype)gg_countDownWithBeginNumber:(NSInteger)number endTitle:(NSString *)endTitle begin:(countDownBeginCallBack)beginCount finished:(countDownFinishedCallBack)finishCount

{

GGCountDownLabel *countDownLabel = [GGCountDownLabel shareCountDownLabel];

//** 防止重叠动画 */

if (isAnimating) return nil;

//默认倒计时为三秒

countDownLabel.number = 3;

if (number && number > 0) countDownLabel.number = number;

if (endTitle && endTitle.length > 0) countDownLabel.endTitle = endTitle;

if (beginCount) countDownLabel.beginCount = beginCount;

if (finishCount) countDownLabel.finishCount = finishCount;

[self gg_configLabel:countDownLabel];

[self gg_scaleActionWithLabel:countDownLabel beginBlock:beginCount finishedBlock:finishCount];

return countDownLabel;

}

/** 配置 label 的基本属性 */

+ (void)gg_configLabel:(GGCountDownLabel *)label

{

label.hidden = NO;

label.frame = CGRectMake(0, 0, GGScreenWith, GGScreenHeight/2);

label.center = CGPointMake(GGScreenWith/2, GGScreenHeight/2);

label.transform = CGAffineTransformScale(label.transform, 15, 15);

label.alpha = 0;

label.text = [NSString stringWithFormat:@"%zd",label.number];

label.textColor = [UIColor whiteColor];

label.font = [UIFont boldSystemFontOfSize:12];

label.textAlignment = NSTextAlignmentCenter;

[[label gg_getCurrentSuperView] addSubview:label];

}

// 获取当前显示的控制器的View

- (UIView *)gg_getCurrentSuperView

{

return [self gg_getVisibleViewControllerFrom:(UIViewController *)GGAppDelegate.window.rootViewController].view;

}

- (UIViewController *)gg_getVisibleViewControllerFrom:(UIViewController*)vc

{

if ([vc isKindOfClass:[UINavigationController class]]) {

return [self gg_getVisibleViewControllerFrom:[((UINavigationController*) vc) visibleViewController]];

}else if ([vc isKindOfClass:[UITabBarController class]]){

return [self gg_getVisibleViewControllerFrom:[((UITabBarController*) vc) selectedViewController]];

} else {

if (vc.presentedViewController) {

return [self gg_getVisibleViewControllerFrom:vc.presentedViewController];

} else {

return vc;

}

}

}

/** 倒计时动画 */

+ (void)gg_scaleActionWithLabel:(GGCountDownLabel *)label beginBlock:(countDownBeginCallBack)beginCount finishedBlock:(countDownFinishedCallBack)finishCount

{

if (!isAnimating) {

if (label.beginCount) {

label.beginCount();

}

}

if (label.number >= (label.endTitle.length ? 0 : 1 )) {

isAnimating = YES;

label.text = label.number == 0 ? label.endTitle : [NSString stringWithFormat:@"%zd",label.number];

[UIView animateWithDuration:1.0 animations:^{

label.alpha = 1;

label.transform = CGAffineTransformIdentity;

} completion:^(BOOL finished) {

if (finished) {

label.number --;

label.alpha = 0;

label.transform = CGAffineTransformScale(label.transform, 15, 15);

[self gg_scaleActionWithLabel:label beginBlock:beginCount finishedBlock:finishCount];

}

}];

}else {

if (label.finishCount) label.finishCount();

[self gg_hidden];

}

}

/** 隐藏 */

+ (void)gg_hidden

{

isAnimating = NO;

[GGCountDownLabel shareCountDownLabel].transform = CGAffineTransformIdentity;

[GGCountDownLabel shareCountDownLabel].hidden = YES;

[[GGCountDownLabel shareCountDownLabel] removeFromSuperview];

}

@end

html读秒倒计时,读秒倒计时相关推荐

  1. android 按钮倒计时读秒

    最近项目中有涉及到android倒计时读秒功能的实现,于是上网搜了一下,各种方式都有,但是感觉要么存在bug,要么有点复杂,于是在参考了一些他人的实现方式后,自己写了一个. 代码如下: public ...

  2. android 日倒计时计算器,倒计时(倒数日在线计算)

    2.这个程序得到火箭专家们的一致赞许,而且超越了使用范围,在这部影片中,扣. 它的意义有二.1"点火的发射程序:倒计时,成为一个适用性极强."倒计时"这一. 正计时 原因 ...

  3. JS-实现秒表倒计时+缓存倒计时

    实现秒表倒计时+缓存倒计时功能 <!DOCTYPE html> <html><head><meta charset="UTF-8"> ...

  4. setInterval 倒计时 清除倒计时 clearInterval

    倒计时清除 setInterval 倒计时5s后跳转页面, clearInterval(this.handler); 清除倒计时 不执行倒计时里面的跳转, 点击事件强制跳转到其他页面 并且清除 倒计时 ...

  5. 华为手机日历倒计时_倒计时40小时!谁来拿走这台华为手机?

    最近小编发现最新款的华为mate40很难买出现了一机难求的现象线上订不到,线下又限购 但是!掌心商城为你准备了现在有一个机会只要花1元钱,就有机会赢得华为最新款5G手机HUAWEI Mate 40 方 ...

  6. php mysql倒计时_php 倒计时程序

    测试页面 //获取系统时间,将时间以指定格式显示到页面. function systemTime() { //获取系统时间. var dateTime=new Date(); var YY=dateT ...

  7. java源代码实例倒计时_Java倒计时三种实现方式代码实例

    写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...

  8. 电脑时钟倒计时_倒计时久坐休息提醒工具

    现在上班大家都需要坐在电脑前办公,一坐就是一整天.回到家,依然是坐着吃饭.坐着休息,导致了现代都市人颈椎病高发.久坐不仅对颈椎不好,对腰椎.脊柱等不利. 自己一直没有找到合适的倒计时久坐休息提醒工具, ...

  9. 固定日期时间倒计时,倒计时不可点击,普通倒计时

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

最新文章

  1. More Effective C++:理解new和delete
  2. php父子遍历,php无限分类父子追溯方法
  3. 结构体引用_C/C++结构体完全攻略
  4. 【JUnit 报错】 method initializationerror not found:JUnit4单元测试报错问题
  5. java变量自增题的分解08251944
  6. 某项目网络实施中的几个关键点解析
  7. hbuild 编译 php,Hbuilder的PHP环境搭建
  8. 用实际的软件编程示例解释C#中的装饰器模式
  9. linux工具-journalctl查询日志
  10. Java 类和Static关键字
  11. 视频转rtmp流及搭建视频流服务器
  12. 路由器选华硕还是tp_家用选TP-LINK路由器好还是华为路由器好
  13. 如何在Microsoft Word里面插入图片作为背景/封面?
  14. 如何添加二级域名(图文超级详细)
  15. 从coursera网站自动下载网课视频(Linux中bash操作)
  16. (poj 2377)Kruskal算法 最大生成树
  17. 湘潭大学计算机组成原理试卷,湘潭大学11级原理课堂测验题集.ppt
  18. part-4 运放噪声快速计算
  19. 获取美元人民币实时汇率-Python版
  20. 初次安装mysql 如何启动_CentOS第一次安装MySQL的完整步骤

热门文章

  1. JAVA实现Excel照相机功能_Excel如何将工作表转换为图片,并随着数据的变化自动更新?...
  2. 每天一点产品思考(3):“稍后阅读”功能真的能有效解决碎片信息处理问题吗?...
  3. WML 中文参考手册
  4. asp.net core webAPI学习笔记(三)资源请求
  5. 15.CUDA编程手册中文版---附录K CUDA计算能力
  6. CoreAudioApi-音频端点设备-检测耳机插拔
  7. diskgenius创建efi分区_复制文件到当前分区
  8. 8.10 12.1-12.5
  9. mac 配置mysql
  10. 商品货架管理(愿疫情早日消散,大家去见想见的人)