一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

iOS开发之实现商品倒计时效果

时间:2022-06-25 23:39:50 编辑:袖梨 来源:一聚教程网

一.倒计时(如:发送验证码)

#define countDownTime 119  //倒计时时间
#pragma mark - 倒计时
- (void)myTimer
{
    if (countDownTime) {
        __block int timeout= countDownTime; //倒计时时间
        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(), ^{
                //设置界面的按钮显示 根据自己需求设置
                });
            }else{
                int hours = timeout / (60 * 60);
                int minute = timeout % (60 * 60) / 60;
                int seconds = timeout % 60;
                if (hours < 10) {
                    hours = [[NSString stringWithFormat:@"0%d",hours] intValue];
                }
                if (minute < 10) {
                    minute = [[NSString stringWithFormat:@"0%d",minute] intValue];
                }
                if (seconds < 10) {
                    seconds = [[NSString stringWithFormat:@"0%d",seconds] intValue];
                }
                dispatch_async(dispatch_get_main_queue(), ^{
                    //设置界面的按钮显示 根据自己需求设置
                    [UIView beginAnimations:nil context:nil];
                    [UIView setAnimationDuration:1];
                    hourLabel.text = [NSString stringWithFormat:@"%d",hours];
                    minuteLabel.text = [NSString stringWithFormat:@"%d",minute];
                    secondsLabel.text = [NSString stringWithFormat:@"%d",seconds];
                    if (hours < 10) {
                        hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
                    }
                    if (minute < 10) {
                        minuteLabel.text = [NSString stringWithFormat:@"0%d",minute];
                    }
                    if (seconds < 10) {
                        secondsLabel.text = [NSString stringWithFormat:@"0%d",seconds];
                    }
                    [UIView commitAnimations];
                });
                timeout--;
            }
        });
        dispatch_resume(timer);
    }
}

二.倒计时(并计算时间差)

全局变量:dispatch_source_t _timer;
#pragma mark - 倒计时
- (void)countDown{
    NSDate *now = [NSDate date];
    NSDateFormatter *formatDay = [[NSDateFormatter alloc] init];
    formatDay.dateFormat = @"yyyy-MM-dd";
    NSString *dayStr = [formatDay stringFromDate:now];
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    
    NSDate *endDate = [dateFormatter dateFromString:dayStr];
    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(), ^{
                        hourLabel.text = @"00";
                        minuteLabel.text = @"00";
                        secondsLabel.text = @"00";
                    });
                }else{
                    int hours = (int)(timeout / 3600);
                    int minutes = (int)(timeout - hours * 3600) / 60;
                    int seconds = timeout - hours * 3600 - minutes * 60;
                    dispatch_async(dispatch_get_main_queue(), ^{
                        if (hours < 10) {
                            hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
                        }else{
                            hourLabel.text = [NSString stringWithFormat:@"%d",hours];
                        }
                        if (minutes < 10) {
                            minuteLabel.text = [NSString stringWithFormat:@"0%d",minutes];
                        }else{
                            minuteLabel.text = [NSString stringWithFormat:@"%d",minutes];
                        }
                        if (seconds < 10) {
                            secondsLabel.text = [NSString stringWithFormat:@"0%d",seconds];
                        }else{
                            secondsLabel.text = [NSString stringWithFormat:@"%d",seconds];
                        }
                        
                    });
                    timeout--;
                }
            });
            dispatch_resume(_timer);
        }
    }
}

例子三

__block int timeout=59; //倒计时时间 
   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(aSelf.timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行 
   dispatch_source_set_event_handler(aSelf.timer, ^{ 
       if(timeout<=0){ //倒计时结束,关闭 
           dispatch_source_cancel(aSelf.timer); 
           aSelf.timer = nil; 
           dispatch_async(dispatch_get_main_queue(), ^{ 
               //设置界面的按钮显示 根据自己需求设置 
           }); 
       }else{ 
           //            int minutes = timeout / 60; 
           int seconds = timeout % 60; 
           NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds]; 
           dispatch_async(dispatch_get_main_queue(), ^{ 
               //设置界面的按钮显示 根据自己需求设置 
           }); 
           timeout--; 
       } 
   }); 

dispatch_resume(aSelf.timer); 

好了以上就是关于ios倒计时的一个实现方法了,这个和js中的倒计时非常的接近的哦各位应该懂了吧。

热门栏目