aischool 倒计时VIEW封装
@implementation TWPaperTimeCountLabel
{
NSInteger miaoshu;
dispatch_source_t _timer;
}
-(id)initWithframe:(CGRect)frame endTime:(NSDate *)endtime delegate:(id<TWPaperTimelabelDelegate>)delegate
{
self = [super initWithFrame:frame];
if (self) {
self.delegate = delegate;
[self setcontentWith:endtime];
}
return self;
}
-(id)initWithframe:(CGRect)frame endTimeStr:(NSString *)endtimestr delegate:(id<TWPaperTimelabelDelegate>)delegate
{
self = [super initWithFrame:frame];
if (self) {
self.delegate = delegate;
if (endtimestr!=nil && [endtimestr isKindOfClass:[NSString class]]) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *destDate= [dateFormatter dateFromString:endtimestr];
[self setcontentWith:destDate];
}
}
return self;
}
-(void)reloadTime:(NSString *)endtimestr
{
if (endtimestr!=nil && [endtimestr isKindOfClass:[NSString class]]) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *destDate= [dateFormatter dateFromString:endtimestr];
[self setcontentWith:destDate];
}
}
-(void)setcontentWith:(NSDate *)data
{
NSDate *now = [NSDate new];
NSCalendar *cal = [NSCalendar currentCalendar];
unsigned int unitFlags = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *d = [cal components:unitFlags fromDate:now toDate:data options:0];
NSInteger alltime = [d day]*3600*24+[d hour]*3600+[d minute]*60+[d second];
if(alltime>0)
{
[self GCDtimeresume:alltime];
}else
{
if (self.delegate!=nil && [self.delegate respondsToSelector:@selector(paperCountdownIsOver:)]) {
[self.delegate paperCountdownIsOver:self];
}
}
}
-(void)GCDtimeresume:(NSInteger)alltimeSecond
{
__block NSInteger timeout=alltimeSecond; //倒计时时间
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
WEAKSELF;
dispatch_source_set_event_handler(_timer, ^{
if(weakSelf == nil)
{
dispatch_source_cancel(_timer);
}
if(timeout<=0){ //倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
if (weakSelf.delegate!=nil && [weakSelf.delegate respondsToSelector:@selector(paperCountdownIsOver:)]) {
[weakSelf.delegate paperCountdownIsOver:weakSelf];
}
});
}else{
[weakSelf setlabel:timeout];
timeout--;
}
});
dispatch_resume(_timer);
}
-(void)stopcount
{
if(_timer)
{
dispatch_source_cancel(_timer);
}
}
-(void)setlabel:(NSInteger)alltimeSecond
{
NSString *content =@"倒计时: ";
NSInteger seconds = alltimeSecond % 60;
NSInteger minutes = (alltimeSecond / 60) % 60;
NSInteger hours = alltimeSecond / 3600;
if (hours>0) {
content =[content stringByAppendingString:[NSString stringWithFormat:@"%ld小时",(long)hours]];
}
if (minutes>0) {
content =[content stringByAppendingString:[NSString stringWithFormat:@"%ld分",(long)minutes]];
}
if (seconds>0) {
content =[content stringByAppendingString:[NSString stringWithFormat:@"%ld秒",(long)seconds]];
}
dispatch_async(dispatch_get_main_queue(), ^{
self.text = content;
});
}
aischool 倒计时VIEW封装的更多相关文章
- ios 照片编辑的view封装
转:http://www.cnblogs.com/xiaobaizhu/archive/2013/07/03/3170101.html 该控件有旋转,缩放,拖动,剪裁的功能,封装成了一个ImageCr ...
- Vue 倒计时组件封装
项目中需要用到倒计时的功能,封装了一个组件. 代码解读: 1:created周期中获取传入参数时间的剩余秒数: this.initSecondsLeft() 并绑定间隔事件 intervalEvent ...
- iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...
- iOS边练边学--view的封装
一.view封装的思路: *如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件的创建屏蔽起来,不让外界关心 *外界可以传入对应的模型数据给view,view拿到模型数据 ...
- ios开发瀑布流框架的封装
一:瀑布流框架封装的实现思路:此瀑布流框架的封装仿照tableView的底层实现,1:每个cell的frame的设置都是找出每列的最大y值,比较每列的最大y值,将下一个cell放在最大y值最小的那一列 ...
- ListView加载性能优化---ViewHolder---分页
ListView是Android中一个重要的组件,可以使用它加列表数据,用户可以自己定义列表数据,同时ListView的数据加载要借助Adapter,一般情况下要在Adapter类中重写getCoun ...
- android标题栏下面弹出提示框(一) TextView实现,带动画效果
产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...
- Authentication of Django
Django Authentication 用户认证系统 一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Dj ...
- WebApp中的页面生命周期及路由管理
最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在 ...
随机推荐
- [leetcode] 题型整理之查找
1. 普通的二分法查找查找等于target的数字 2. 还可以查找小于target的数字中最小的数字和大于target的数字中最大的数字 由于新的查找结果总是比旧的查找结果更接近于target,因此只 ...
- 数据库密码爆破HexorBase
数据库密码爆破HexorBase 数据库服务是服务器上最常见的一类服务.由于数据库保存大量的敏感信息,所以它的安全非常重要.测试数据库服务安全的重要方式,就是检查口令的强壮度. Kali Li ...
- HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)
一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ...
- [转]netty对http协议解析原理
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- UVA567
var i,n,j,k,t:longint;a:array[1..20,1..20]of longint; function min(a,b:longint):longint;begin if a&l ...
- discuz sphinx全文检索搜索引擎方案
基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置 # # linuxTone full index search configure file # source lt_p ...
- BSBuDeJie_01
一. 基本配置 1 项目图标 将图片直接拖入Assets-AppIcon 2 启动图片 3 软件名称 4 删除Main.stroryboard 5 设置窗口的根控制器 - (BOOL) ...
- jquery 时间戳与日期转换
(function($) { $.extend({ myTime: { /** * 当前时间戳 * @return <int> unix时间戳(秒) */ CurTime: functio ...
- 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎
战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...
- 使用mutt+msmtp在Linux命令行界面下发邮件(续)
一年前写过一篇<使用mutt+msmtp在Linux命令行界面下发邮件>,但是最近想照着文中的办法解决新的问题时发现又有新的疑惑了,所以就有了今天这篇“续集”. 首先说说msmtp.如果你 ...