iOS開發之實現商品倒計時效果

來源:互聯網
上載者:User

一.倒計時(如:發送驗證碼)

#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中的倒計時非常的接近的哦各位應該懂了吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.