亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現毫秒倒計時的方法詳解

2020-07-26 02:50:30
字體:
來源:轉載
供稿:網友

前言

大家應該都知道在app開發中,當展示限時優惠的某些商品時,往往會加一個倒計時,提示用戶該商品限時優惠所剩的時間,。那對于開發者來說,這就需要我們去實現的是一個倒計時的功能,這個倒計時根據具體需求,可以以天、小時、分、秒、毫秒作單位。

今天呢,主要說說毫秒計時器。我們知道秒和毫秒之間的進制是1000,也就是說1秒=1000毫秒,那我們做毫秒倒計時器的時候是設置一個時間間隔為1毫秒的計時器,逐一減少毫秒數。但是這樣的話太耗時了,所以很多的毫秒計時器中的毫秒數只是0-9之間的數字,這就意味著,這個毫秒計時器的時間間隔是100毫秒,這樣相比起1毫秒為間隔的計時器,其消耗就少了很多,同時也達到毫秒計時的效果。

那對于整個毫秒倒計時的實現思路就是:得到未來某個日期的時間戳和當前日期的時間戳,計算這兩者之間的時間差,然后設置一個時間間隔為100毫秒的計時器,每隔100毫秒,更新一下倒計時器上相應的數值。

實現方法

自定義一個UIview,將倒計時封裝起來。

一、在MsecCountDownView.h中增加時間戳和計時器這兩屬性

@interface MsecCountDownView : UIView@property(nonatomic, assign)double timeInterval;//未來某個日期的時間戳@property(nonatomic, strong)NSTimer *timer ; //定時器@end

二、在MsecCountDownView.m實現相關UI及倒計時方法

@interface MsecCountDownView (){UIView *countdownBackView;CGFloat _passTime;}@property(nonatomic, strong)UILabel *tipLabel;@property(nonatomic, strong)UILabel *hoursLabel;@property(nonatomic, strong)UILabel *minutesLabel;@property(nonatomic, strong)UILabel *secondsLabel;@property(nonatomic, strong)UILabel *millionSecondsLabel;@property(nonatomic, strong)UILabel *label1;@property(nonatomic, strong)UILabel *label2;@property(nonatomic, strong)UILabel *label3;@property(nonatomic, strong)UILabel *label4;@end

創建相關UI

- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) {  countdownBackView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  [self addSubview:countdownBackView];  _tipLabel=[[UILabel alloc] init];  _tipLabel.frame = CGRectMake(0, 0, 40, countdownBackView.frame.size.height);  [countdownBackView addSubview:_tipLabel];  _tipLabel.font = [UIFont systemFontOfSize:12];  //小時  _hoursLabel=[[UILabel alloc] initWithFrame:CGRectMake(_tipLabel.frame.origin.x+_tipLabel.frame.size.width, 0, 35, countdownBackView.frame.size.height)];  [countdownBackView addSubview:_hoursLabel];  _hoursLabel.font = [UIFont systemFontOfSize:11];  _label1=[[UILabel alloc] initWithFrame:CGRectMake(_hoursLabel.frame.origin.x+_hoursLabel.frame.size.width, _hoursLabel.frame.origin.y, 8, countdownBackView.frame.size.height)];  [countdownBackView addSubview:_label1];  //分鐘  _minutesLabel=[[UILabel alloc] initWithFrame:CGRectMake(_label1.frame.origin.x+_label1.frame.size.width, _hoursLabel.frame.origin.y, 20, countdownBackView.frame.size.height)];  [countdownBackView addSubview:_minutesLabel];  _minutesLabel.font = [UIFont systemFontOfSize:11];  _label2=[[UILabel alloc] initWithFrame:CGRectMake(_minutesLabel.frame.origin.x+_minutesLabel.frame.size.width, _hoursLabel.frame.origin.y, 8, countdownBackView.frame.size.height)];  [countdownBackView addSubview:_label2];  //秒  _secondsLabel=[[UILabel alloc] initWithFrame:CGRectMake(_label2.frame.origin.x+_label2.frame.size.width, _hoursLabel.frame.origin.y, 20 , countdownBackView.frame.size.height)];  [countdownBackView addSubview:_secondsLabel];  _secondsLabel.font = [UIFont systemFontOfSize:11];  _label3=[[UILabel alloc] initWithFrame:CGRectMake(_secondsLabel.frame.origin.x+_secondsLabel.frame.size.width, _hoursLabel.frame.origin.y, 8 , countdownBackView.frame.size.height)];  [countdownBackView addSubview:_label3];  _millionSecondsLabel=[[UILabel alloc] initWithFrame:CGRectMake(_label3.frame.origin.x+_label3.frame.size.width, _hoursLabel.frame.origin.y, 20, countdownBackView.frame.size.height)];  [countdownBackView addSubview:_millionSecondsLabel];   //毫秒  _millionSecondsLabel.font = [UIFont systemFontOfSize:11];  _label1.textAlignment=1;  _label2.textAlignment=1;  _label3.textAlignment = 1;  _hoursLabel.textAlignment=1;  _minutesLabel.textAlignment=1;  _secondsLabel.textAlignment=1;  _millionSecondsLabel.textAlignment=1;  _passTime=0.0; } return self;}

生成一個計時器

//得到未來某個日期的時間戳,與當前時間戳相比,得到兩者的時間差,生成定時器- (void)setTimeInterval:(double)timeInterval{ _timeInterval = timeInterval ; NSDateFormatter *dataFormatter = [[NSDateFormatter alloc] init]; dataFormatter.dateFormat = @"MM/dd/yyyy HH:mm:ss.SSS"; //獲取當前系統的時間,并用相應的格式轉換 [dataFormatter stringFromDate:[NSDate date]]; NSString *currentDayStr = [dataFormatter stringFromDate:[NSDate date]]; NSDate *currentDate = [dataFormatter dateFromString:currentDayStr]; //優惠結束的時間,也用相同的格式去轉換 NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval/1000.0]; NSString *deadlineStr = [dataFormatter stringFromDate:date]; NSDate *deadlineDate = [dataFormatter dateFromString:deadlineStr]; _timeInterval=[deadlineDate timeIntervalSinceDate:currentDate]*1000; if (_timeInterval!=0) {  //時間間隔是100毫秒,也就是0.1秒  _timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];  [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode]; }else{  [countdownBackView removeFromSuperview]; }}

實現每隔100毫秒執行的方法,更新倒計時器上面相應的數值

// 每間隔100毫秒定時器觸發執行該方法- (void)timerAction{ [self getTimeFromTimeInterval:_timeInterval] ; // 當時間間隔為0時干掉定時器 if (_timeInterval-_passTime == 0) {  [_timer invalidate] ;  _timer = nil ; }}// 通過時間間隔計算具體時間(小時,分,秒,毫秒)- (void)getTimeFromTimeInterval : (double)timeInterval{ //1s=1000毫秒 _passTime += 100.f;//毫秒數從0-9,所以每次過去100毫秒 _tipLabel.text=@"還剩:"; _label3.text=@"."; _label2.text=@":"; _label1.text=@":"; //小時數 NSString *hours = [NSString stringWithFormat:@"%ld", (NSInteger)((timeInterval-_passTime)/1000/60/60)]; //分鐘數 NSString *minute = [NSString stringWithFormat:@"%ld", (NSInteger)((timeInterval-_passTime)/1000/60)%60]; //秒數 NSString *second = [NSString stringWithFormat:@"%ld", ((NSInteger)(timeInterval-_passTime))/1000%60]; //毫秒數 CGFloat sss = ((NSInteger)((timeInterval - _passTime)))%1000/100; NSString *ss = [NSString stringWithFormat:@"%.lf", sss]; if (minute.integerValue < 10) {  minute = [NSString stringWithFormat:@"0%@", minute]; } self.hoursLabel.text = [NSString stringWithFormat:@"%@",hours]; self.minutesLabel.text = [NSString stringWithFormat:@"%@",minute]; self.secondsLabel.text = [NSString stringWithFormat:@"%@",second]; self.millionSecondsLabel.text = [NSString stringWithFormat:@"%@",ss]; if (timeInterval - _passTime <= 0) {  [countdownBackView removeFromSuperview];  [self removeFromSuperview]; }}

三、在ViewController.m給倒計時器賦值,實現自己想要的倒計時

- (void)viewDidLoad { [super viewDidLoad]; msecView=[[MsecCountDownView alloc] initWithFrame:CGRectMake(50, 100, self.view.frame.size.width-100, 16)]; [self.view addSubview:msecView]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"]; NSDate* date = [formatter dateFromString:@"2017-04-11 15:10:00.000"]; //將日期轉換成時間戳 NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue]*1000; msecView.timeInterval=timeSp;}

這樣就實現倒計時的功能了。但是使用倒計時還需要注意一點,當離開該頁面的時候,記得把定時器暫停,等回到該頁面的時候再啟動倒計時。

這個可以通過以下兩方法實現。

-(void)viewWillAppear:(BOOL)animated{// 頁面出現時,開啟計時器  [msecView.timer setFireDate:[NSDate distantPast]];}-(void)viewWillDisappear:(BOOL)animated{// 頁面消失時,暫停提示器 [msecView.timer setFireDate:[NSDate distantFuture]];}

如有需要,可通過下面兩種方法下載demo

一:GitHub上下載

二:本地下載

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品高潮在线| 国产精品久久综合av爱欲tv| 亚洲国产天堂久久国产91| 麻豆国产va免费精品高清在线| 欧美日韩综合视频网址| 国内伊人久久久久久网站视频| 亚洲欧洲一区二区三区在线观看| 欧美精品免费在线观看| 成人黄色免费片| 国产区精品视频| 精品偷拍一区二区三区在线看| 欧美孕妇与黑人孕交| 久久久久久午夜| 亚洲欧美日韩国产中文专区| 国产精品草莓在线免费观看| 亚洲一区二区三区成人在线视频精品| 中文日韩在线视频| 中文字幕在线亚洲| 亚洲深夜福利网站| 欧美性xxxxxxxxx| 少妇av一区二区三区| 国产在线98福利播放视频| 久久久精品日本| 国产精品视频播放| 欧美国产日韩中文字幕在线| 亚洲国产精品va在线| 欧美视频免费在线| 69av成年福利视频| 亚洲国产中文字幕久久网| 97香蕉超级碰碰久久免费软件| 亚洲白拍色综合图区| 国产欧美亚洲视频| 亚洲精品99999| 色老头一区二区三区| 国产精品av免费在线观看| 亚洲女人被黑人巨大进入| 国产精品中文久久久久久久| 久久婷婷国产麻豆91天堂| 欧美夜福利tv在线| 色小说视频一区| 亚洲国产成人91精品| 亚洲第一中文字幕在线观看| 日韩视频在线一区| 精品视频久久久久久| 亚洲影视中文字幕| 国产精品69久久久久| 久久精品中文字幕一区| 欧美xxxwww| 久久久久久91| 国产精品女主播| 亚洲最新在线视频| 性金发美女69hd大尺寸| 欧美性生活大片免费观看网址| 日韩av在线直播| 亚洲高清久久久久久| 精品久久久久久久久久| 日韩精品在线免费观看视频| 九九视频这里只有精品| 日韩视频欧美视频| 91精品国产免费久久久久久| 亚洲日本欧美日韩高观看| 亚洲成人三级在线| 欧美专区在线观看| 福利一区福利二区微拍刺激| 亚洲国产精品成人精品| 91精品免费视频| 亚洲精品av在线播放| 久久久久久久999| 91国产中文字幕| 91麻豆国产精品| 久久久精品中文字幕| 欧美国产亚洲视频| 欧美性生活大片免费观看网址| 亚洲日本成人网| 国产精品毛片a∨一区二区三区|国| 影音先锋欧美在线资源| 2018中文字幕一区二区三区| 亚洲男人的天堂在线播放| 日韩成人高清在线| 欧美日韩国产一区二区三区| 亚洲国产97在线精品一区| 亚洲精品成人久久久| 色婷婷av一区二区三区久久| 色哟哟入口国产精品| www.日韩视频| 国产精品入口免费视频一| 欧美激情视频一区二区三区不卡| 精品视频一区在线视频| 91在线网站视频| 国产精品久久久久久久天堂| 国产精品一区二区久久精品| 97热在线精品视频在线观看| 亚洲福利在线播放| 久久人人爽人人爽人人片av高请| 5566日本婷婷色中文字幕97| 国产成人精品电影| 亚洲国产成人精品女人久久久| 欧美成人亚洲成人| 国产一区二区三区四区福利| 亚洲精品欧美一区二区三区| 久久九九热免费视频| 欧美激情综合色综合啪啪五月| 中文字幕视频在线免费欧美日韩综合在线看| 一区二区三区精品99久久| 久久久www成人免费精品张筱雨| 欧美大全免费观看电视剧大泉洋| 精品国产一区二区三区久久狼黑人| 国内揄拍国内精品| 久久久999精品视频| 91欧美激情另类亚洲| 亚洲无亚洲人成网站77777| 日韩欧美在线观看视频| 欧美日韩国产成人在线观看| 中文字幕在线精品| 亚洲一区二区三区sesese| 久久久91精品国产一区不卡| 最近2019中文字幕第三页视频| 国产成人精品av| 美日韩精品免费观看视频| 91在线视频免费| 91视频免费在线| 精品国产乱码久久久久久婷婷| 日韩极品精品视频免费观看| 国产香蕉精品视频一区二区三区| 日韩一区av在线| 亚洲欧洲黄色网| 俺去亚洲欧洲欧美日韩| 亚洲欧美日韩精品| 国产精品福利网站| 亚洲欧美在线一区| 久久久久久成人| 国产不卡视频在线| 91国偷自产一区二区三区的观看方式| 亚洲国产91色在线| 日韩av日韩在线观看| 欧美精品18videos性欧| 97在线观看免费| 日本精品视频网站| 久久香蕉频线观| 欧美激情在线视频二区| 欧美肥婆姓交大片| 免费av一区二区| 日韩美女av在线免费观看| 国产精品福利网站| 中文字幕综合一区| 亚洲男人天天操| 国产视频自拍一区| 亚洲xxxxx性| 亚洲美女av黄| 国产午夜精品视频免费不卡69堂| 国产丝袜一区二区三区| 伊人久久精品视频| 日韩av电影在线网| 久久久999国产精品| 国产精品久久999| 一本色道久久综合亚洲精品小说| 国产在线999| 成人欧美一区二区三区黑人| 久久91精品国产91久久久| 国产裸体写真av一区二区| 亚洲自拍另类欧美丝袜| 欧美性猛交xxxx乱大交蜜桃| 成人啪啪免费看| 欧美视频在线免费看|