iOS开发之--实现倒计时显示时分秒

这段时间写公司的一个外包项目,需要用到倒计时:需要显示时分秒,通过在网上搜集资料,找到了2中方法,我把这两种方法结合起来,可以很好的满足这个需求:

1、创建一个类继承自UIlabel,用来展示时分秒的

.h文件

#import <UIKit/UIKit.h>

@interface TimerLab : UILabel

@property (nonatomic,assign)NSInteger second;
@property (nonatomic,assign)NSInteger minute;
@property (nonatomic,assign)NSInteger hour;

@end

.m文件

#import "TimerLab.h"
@interface TimerLab ()
@property (nonatomic, strong)NSTimer *timer;
@end

@implementation TimerLab

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.textAlignment = NSTextAlignmentCenter;
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeHeadle) userInfo:nil repeats:YES];
    }
    return self;
}

- (void)timeHeadle{
    
    self.second--;
    if (self.second==-1) {
        self.second=59;
        self.minute--;
        if (self.minute==-1) {
            self.minute=59;
            self.hour--;
        }
    }
    
    if (self.hour < 0  || self.minute < 0 || self.second < 0) {
        self.text = @"倒计时结束需要显示的字样";
        [self.timer invalidate];
        self.timer = nil;
    }else
    {
        self.text = [NSString stringWithFormat:@"%ld:%ld:%ld",(long)self.hour,(long)self.minute,(long)self.second];
        
    }
    if (self.second==0 && self.minute==0 && self.hour==0) {
        [self.timer invalidate];
        self.timer = nil;
    }
}


@end

2、我是在cell里面显示的,(这里注意,不能用xib或者SB拖得,那样不行,必须得是手写,具体是因为使用拖得空间,没有走alloc很重,所以在控制器上显示会有问题)

(1)在项目里面具体实现下面这2个方法

#pragma mark 每个cell倒计时的方法/*-------------------------------------------------------*/
- (NSString*)remainingTimeMethodAction:(long long)endTime
{
    //得到当前时间
    NSDate *nowData = [NSDate date];
    NSLog(@"---当前时间:%@",nowData);
    NSDate *endData=[NSDate dateWithTimeIntervalSince1970:endTime];
    NSLog(@"----结束时间%@",endData);
    NSCalendar* chineseClendar = [ [ NSCalendar alloc ] initWithCalendarIdentifier:NSGregorianCalendar ];
    NSUInteger unitFlags =
    NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
    NSDateComponents *cps = [chineseClendar components:unitFlags fromDate:nowData toDate: endData options:0];
    NSInteger Hour = [cps hour];
    NSInteger Min = [cps minute];
    NSInteger Sec = [cps second];
    NSInteger Day = [cps day];
    NSInteger Mon = [cps month];
    NSInteger Year = [cps year];
    NSLog( @" From Now to %@, diff: Years: %ld Months: %ld, Days; %ld, Hours: %ld, Mins:%ld, sec:.%ld",
          [nowData description], (long)Year, (long)Mon, (long)Day, (long)Hour, (long)Min,(long)Sec );
    //    NSString *countdown = [NSString stringWithFormat:@"还剩: %zi天 %zi小时 %zi分钟 %zi秒 ", Day,Hour, Min, Sec];
    NSString *countdown = [NSString stringWithFormat:@"%zi:%zi:%zi",Hour, Min, Sec];
    NSLog(@"0000%@",countdown);
    if (Sec<0 && Min<0 && Hour<0) {
        countdown=[NSString stringWithFormat:@"进行中"];
    }
    return countdown;
}

//时间转化时间戳
-(NSString *)checksting:(NSString *)datas
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    
    NSDate *date = [formatter dateFromString:datas];
    NSString *timerStrs = [NSString stringWithFormat:@"%ld", (long)[date timeIntervalSince1970]];
    return timerStrs;
}

#pragma mark/*------------------------------------------------------------------------- */

3,cell里面的具体赋值操作

 //1、 获得到期时间串
        NSString *timSts = [NSString stringWithFormat:@"%@",model.time2];
        
        //2、 转化成到时时间戳,并传进对比方法里面
        NSString *timerStrs = [NSString stringWithFormat:@"%@",[self remainingTimeMethodAction:[[self checksting:timSts] longLongValue]]];
        
        //3、 分割字符串,取出时分秒
        NSArray *ary = [timerStrs componentsSeparatedByString:@":"];
        NSLog(@"ary is %@",timerStrs);
        
        if (ary.count == 3) {
            cell.YB_dqTimeLab.hour = [[ary objectAtIndex:0] integerValue];
            cell.YB_dqTimeLab.minute = [[ary objectAtIndex:1] integerValue];
            cell.YB_dqTimeLab.second = [[ary objectAtIndex:2] integerValue];
        }else if(ary.count == 1)
        {
            cell.YB_dqTimeLab.hour = 0;
            cell.YB_dqTimeLab.minute = 0;
            cell.YB_dqTimeLab.second = 0;
        }

我是用了别人写好的倒计时显示用的自定义的label,然后使用时间比对的方法,算出时间差,然后进行倒计时的操作!如有理解不到的地方

还希望大家指正!

原文地址:https://www.cnblogs.com/hero11223/p/6042119.html