zoukankan      html  css  js  c++  java
  • iOS开发日记46-倒计时效果的实现

     今天博主有一个倒计时效果的实现的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.

    首先在需要用到的地方解析总的倒计时时间,博主没有封装,各位看官可以自行封装

    #pragma mark--------新修改,增加倒计时

                    NSString *stringOfTime=[NSString stringWithFormat:@"%@",d[@"shipping_time"]];

                    double endUnixTime = [stringOfTime doubleValue];

                    

    //                NSLog(@"++++++%.2f",endUnixTime);

                    

                    NSCalendar *cal = [NSCalendar currentCalendar];

                    unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

                    NSDate *date1 = [NSDate date];

                    NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:endUnixTime];

                    NSDateComponents *dOfd = [cal components:unitFlags fromDate:date1 toDate:date2 options:0];

                    

                    NSInteger sec = [dOfd hour]*3600+[dOfd minute]*60+[dOfd second];

                    //sec是总秒数

                    

    //                NSLog(@"**********%@",dOfd);

                    UILabel *labelOfTime=(UILabel *)[_scroll viewWithTag:6954321];

                    if (sec>0) {

                        

                        [self setCountDownWithTotalSec:sec withLabel:labelOfTime];

                    }

     然后使用GCD实现倒计时功能

    - (void)setCountDownWithTotalSec:(NSInteger)totalSec withLabel:(UILabel *)timeLbl{

        __block NSInteger timeout = totalSec; //倒计时时间

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_source_t _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);

                dispatch_async(dispatch_get_main_queue(), ^{

                    

                    //设置界面的按钮显示 根据自己需求设置

                    timeLbl.text = @"00:00:00";

                    

                });

            }else{

                long hours = timeout / 3600;

                long minutes = (timeout - hours * 3600) / 60;

                int seconds = timeout % 60;

                NSString *strTime = [NSString stringWithFormat:@"%.2ld%.2ld%.2d",hours,minutes, seconds];

                NSString *firstH = [strTime substringWithRange:NSMakeRange(0, 1)];

                NSString *secondH = [strTime substringWithRange:NSMakeRange(1, 1)];

                NSString *firstM = [strTime substringWithRange:NSMakeRange(2, 1)];

                NSString *secondM = [strTime substringWithRange:NSMakeRange(3, 1)];

                NSString *firstS = [strTime substringWithRange:NSMakeRange(4, 1)];

                NSString *secondS = [strTime substringWithRange:NSMakeRange(5, 1)];

                NSString *newTimeString = [NSString stringWithFormat:@"%@%@:%@%@:%@%@",firstH,secondH,firstM,secondM,firstS,secondS];

                dispatch_async(dispatch_get_main_queue(), ^{

                    

                    timeLbl.text = newTimeString;//回到主线程显示

                    

                });

                timeout--;

            }

        });

        dispatch_resume(_timer);

    }

     上述定时方法在进入后台,挂起,返回前台后,会产生调表,因为两个定时器都在计时,可以在回调中判断程序状态,取消定时

        dispatch_source_set_event_handler(_timer, ^{

             if ([UIApplication sharedApplication].applicationState==UIApplicationStateBackground) {

                dispatch_source_cancel(_timer);

                dispatch_async(dispatch_get_main_queue(), ^{

                     //设置界面的按钮显示 根据自己需求设置

                    timeLbl.text = @" ";

                 });

            }

  • 相关阅读:
    XML错误信息Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-4.0.xsd). For more information, right click on the message in the Problems View ...
    Description Resource Path Location Type Cannot change version of project facet Dynamic Web Module to 2.3.
    maven创建web报错Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:maven-compiler-plugin:3.5.1:runtime Cause: error in opening zip file
    AJAX跨域
    JavaWeb学习总结(转载)
    JDBC学习笔记
    Java动态代理之JDK实现和CGlib实现
    (转)看懂UML类图
    spring boot配置使用fastjson
    python3下django连接mysql数据库
  • 原文地址:https://www.cnblogs.com/Twisted-Fate/p/4952381.html
Copyright © 2011-2022 走看看