iOS 倒计时的简单实现

今天带来的是简单的倒计时功能的实现,由于默认的结束时间为24点,所以即使把这个程序从后台完全清除掉,在运行,看上去也想在继续倒计时一样,大家别被误导

//
//  ViewController.m
//  倒计时
//
//  Created by Amydom on 16/11/21.
//  Copyright © 2016年 Amydom. All rights reserved.
//

#import "ViewController.h"

@interface ViewController (){
    
    dispatch_source_t _timer;
    
}

@property (nonatomic , strong)UILabel * dayLabel;
@property (nonatomic , strong)UILabel * hourLabel;
@property (nonatomic , strong)UILabel * minuteLabel;
@property (nonatomic , strong)UILabel * secondLabel;



@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
  
    [self initView];
    [self getCountdown];
    
    
}

- (void)initView{
    
    _dayLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, 100, 50, 50)];
    [self.view addSubview:_dayLabel];
    
    _hourLabel = [[UILabel alloc]initWithFrame:CGRectMake(_dayLabel.frame.size.width + _dayLabel.frame.origin.x+ 10, 100, 50, 50)];
    [self.view addSubview:_hourLabel];
    
    _minuteLabel = [[UILabel alloc]initWithFrame:CGRectMake(_hourLabel.frame.size.width + _hourLabel.frame.origin.x+ 10, 100, 50, 50)];
    [self.view addSubview:_minuteLabel];
    
    _secondLabel = [[UILabel alloc]initWithFrame:CGRectMake(_minuteLabel.frame.size.width + _minuteLabel.frame.origin.x+ 10, 100, 50, 50)];
    [self.view addSubview:_secondLabel];
}


- (void)getCountdown{
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    //测试数据
    NSDate *endDate = [dateFormatter dateFromString:[self getyyyymmdd]];
    
    NSDate *endDate_tomorrow = [[NSDate alloc]initWithTimeIntervalSinceReferenceDate:([endDate timeIntervalSinceReferenceDate] + 24 * 3600)];
    
    NSDate *startDate = [NSDate date];
    
    NSTimeInterval timeInterval = [endDate_tomorrow timeIntervalSinceDate:startDate];
    
    if (_timer == nil) {
        
        __block int timeout = timeInterval; //倒计时时间
        
        if (timeout != 0) {
            
            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); // 每秒执行
            dispatch_source_set_event_handler(_timer, ^{
                
                if (timeout <= 0) {//倒计时结束,关闭
                    dispatch_source_cancel(_timer);
                    
                    _timer = nil;
                    
                    dispatch_async(dispatch_get_main_queue(), ^{//回到主线程,修改lableText
                        //这里也可以处理倒计时结束后的一些逻辑
                        _dayLabel.text = @"";
                        
                        _hourLabel.text = @"00";
                        
                        _minuteLabel.text = @"00";
                        
                        _secondLabel.text = @"00";
                        
                        
                    });
                    
                }else{
                    
                    int days = (int)(timeout / (3600 * 24));
                    if (days == 0) {
                        
                        _dayLabel.text = @"";
                        
                    }
                    
                    int hours = (int)((timeout-days*24*3600)/3600);
                    int minute = (int)(timeout-days*24*3600-hours*3600)/60;
                    int second = timeout-days*24*3600-hours*3600-minute*60;
                    
                    dispatch_async(dispatch_get_main_queue(), ^{
                        
                        if (days == 0) {
                            
                            self.dayLabel.text = @"0天";
                            
                        }else{
                            self.dayLabel.text = [NSString stringWithFormat:@"%d天",days];
                        }
                        if (hours<10) {
                            self.hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
                        }else{
                            self.hourLabel.text = [NSString stringWithFormat:@"%d",hours];
                        }
                        if (minute<10) {
                            self.minuteLabel.text = [NSString stringWithFormat:@"0%d",minute];
                        }else{
                            self.minuteLabel.text = [NSString stringWithFormat:@"%d",minute];
                        }
                        if (second<10) {
                            self.secondLabel.text = [NSString stringWithFormat:@"0%d",second];
                        }else{
                            self.secondLabel.text = [NSString stringWithFormat:@"%d",second];
                        }
                    });
                    
                    timeout--;
                }
                
                
            });
            
            dispatch_resume(_timer);
        }
    }
    
}
/**
 *  获取当天的年月日的字符串
 *  这里测试用
 *  @return 格式为年-月-日
 */

- (NSString *)getyyyymmdd{
    
    NSDate *now = [NSDate date];
    NSDateFormatter *formatDay = [[NSDateFormatter alloc]init];
    formatDay.dateFormat = @"yyyy-MM-dd";
    NSString *dayStr = [formatDay stringFromDate:now];
    
    return dayStr;
    
    
    
    
    //把数字转化成时间如下:
    
//    NSString*time = @"1329038338";
//    
//    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//    [formatter setDateStyle:NSDateFormatterMediumStyle];
//    [formatter setTimeStyle:NSDateFormatterShortStyle];
//    [formatter setDateFormat:@"YYYY-MM-dd HH:mm"];
//    NSDate*confromTimesp = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval)[time intValue]];
//    NSString*confromTimespStr = [formatter stringFromDate:confromTimesp];
//    dayStr = confromTimespStr;
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值