2018-08-11 15:21:16 yizhiliulangdemiao 阅读数 142
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18851 人正在学习 去看看 邹积超

倒计时按钮在项目中经常用到,为了使用方便我做了简单的封装。
下面直接上代码。

#import <UIKit/UIKit.h>

typedef void(^setBtnAction)();

@interface countdownButton : UIButton

//倒计时开始回调
@property(nonatomic,strong)setBtnAction setBtnAction;

@end
#import "countdownButton.h"

@interface countdownButton()

@property(nonatomic,strong)UIButton * btn;

@end

@implementation countdownButton
{

    NSInteger secondsCountDown;
    NSTimer * countDownTimer;

}
-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self)
    {
        secondsCountDown = 60;

        [self setBtnUI];
    }

    return self;
}

-(void)setBtnUI
{

    [self setBackgroundColor:[UIColor orangeColor]];

    [self setTitle:@"获取验证码" forState:UIControlStateNormal];

    [self.titleLabel setFont:[UIFont systemFontOfSize:14.0]];

    [self addTarget:self action:@selector(countDownAction:) forControlEvents:UIControlEventTouchUpInside];
}

-(void)countDownAction:(UIButton *)sender
{

    [self setTitle:[NSString stringWithFormat:@"%zd s",secondsCountDown] forState:UIControlStateNormal];

    countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeFireMethod) userInfo:nil repeats:YES];

    [self setEnabled:NO];

    if(self.setBtnAction)
    {
        self.setBtnAction();
    }

}

-(void)timeFireMethod
{
    secondsCountDown--;

    [self setTitle:[NSString stringWithFormat:@"%zd s",secondsCountDown] forState:UIControlStateNormal];

    if (secondsCountDown<0)
    {
        [countDownTimer invalidate];

        [self setEnabled:YES];

        [self setTitle:@"获取验证码" forState:UIControlStateNormal];

        secondsCountDown = 60;
    }

}
@end

在需要使用倒计时按钮的地方初始化。
这里我在ViewController 中初始化,记得引入头文件。

#import "countdownButton.h"
 countdownButton * btn = [[countdownButton alloc]initWithFrame:CGRectMake(100, 100, 90, 40)];

    [btn setBackgroundColor:[UIColor purpleColor]];

    [btn setSetBtnAction:^(){

       //这里写入倒计时开始时需要执行的事件。
        NSLog(@"倒计时开始");

    }];

    [self.view addSubview:btn];

demo 地址:https://github.com/xiaobai0134/XBCountDownButton

2019-09-16 15:24:03 a_pawn 阅读数 14
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18851 人正在学习 去看看 邹积超
  • 倒计时60s
  • 倒计时HH-MM-SS
1.倒计时60s
- (void)countDownTime{
    __block NSInteger time = 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(timer,DISPATCH_TIME_NOW,1.0*NSEC_PER_SEC, 0); //每秒执行
    
    dispatch_source_set_event_handler(timer, ^{
        
        if(time <= 0){ //倒计时结束,关闭
            
            dispatch_source_cancel(timer);
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                //设置按钮的样式
                self.timeCountButton.enabled = YES;
                [self.timeCountButton setTitle:@"重新发送" forState:UIControlStateNormal];
            
            });
            
        }else{
            
            int seconds = time % 60;
            dispatch_async(dispatch_get_main_queue(), ^{
                
                
                //设置label读秒效果
                self.timeCountButton.enabled = NO;
                [self.timeCountButton setTitle:[NSString stringWithFormat:@"%.2d秒后再次获取",seconds] forState:UIControlStateDisabled];
                
            });
            
            time--;
        }
    });
    
    dispatch_resume(timer);
}

很多时候在点击按钮发送短信的时候需要倒计时读秒

2.倒计时
- (void)activeCountDownActionWithtime:(NSString *)countTime{
    _timer = nil;
#if 0
    // 1.计算截止时间与当前时间差值
    // 倒计时的时间 测试数据
    NSString *deadlineStr = @"2019-08-19 12:00:00";
    // 当前时间的时间戳
    NSString *nowStr = [self getCurrentTimeyyyymmdd];
    // 计算时间差值
    NSInteger secondsCountDown = [self getDateDifferenceWithNowDateStr:nowStr deadlineStr:deadlineStr];
    
#endif
    NSInteger secondsCountDown = [countTime integerValue];
    if (secondsCountDown == 0) {
        self.timeLabel.text = @"0天00:00:00";
        _timer = nil;
        return;
    }
    // 2.使用GCD来实现倒计时 用GCD这个写有一个好处,跳页不会清零 跳页清零会出现倒计时错误的
    __weak __typeof(self) weakSelf = self;
    
    if (_timer == nil) {
        __block NSInteger timeout = secondsCountDown; // 倒计时时间
        
        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(), ^{
                        weakSelf.timeLabel.text = @"0天00:00:00";
                    });
                } else { // 倒计时重新计算 时/分/秒
                    NSInteger days = (int)(timeout/(3600*24));
                    NSInteger hours = (int)((timeout-days*24*3600)/3600);
                    NSInteger minute = (int)(timeout-days*24*3600-hours*3600)/60;
                    NSInteger second = timeout - days*24*3600 - hours*3600 - minute*60;
                    NSString *strTime = [NSString stringWithFormat:@"0天%02ld:%02ld:%02ld", hours, minute, second];
                    dispatch_async(dispatch_get_main_queue(), ^{
                        if (days == 0) {
                            weakSelf.timeLabel.text = strTime;
                        } else {
                            weakSelf.timeLabel.text = [NSString stringWithFormat:@"%ld天%02ld:%02ld:%02ld", days, hours, minute, second];
                        }
                        
                    });
                    timeout--; // 递减 倒计时-1(总时间以秒来计算)
                }
            });
            dispatch_resume(_timer);
        }
    }
}

/**
 *  获取当天的字符串
 *
 *  @return 格式为年-月-日 时分秒
 */
- (NSString *)getCurrentTimeyyyymmdd {
    
    NSDate *now = [NSDate date];
    NSDateFormatter *formatDay = [[NSDateFormatter alloc] init];
    formatDay.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSString *dayStr = [formatDay stringFromDate:now];
    
    return dayStr;
}

/**
 *  获取时间差值  截止时间-当前时间
 *  nowDateStr : 当前时间
 *  deadlineStr : 截止时间
 *  @return 时间戳差值
 */
- (NSInteger)getDateDifferenceWithNowDateStr:(NSString*)nowDateStr deadlineStr:(NSString*)deadlineStr {
    
    NSInteger timeDifference = 0;
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yy-MM-dd HH:mm:ss"];
    NSDate *nowDate = [formatter dateFromString:nowDateStr];
    NSDate *deadline = [formatter dateFromString:deadlineStr];
    NSTimeInterval oldTime = [nowDate timeIntervalSince1970];
    NSTimeInterval newTime = [deadline timeIntervalSince1970];
    timeDifference = newTime - oldTime;
    
    return timeDifference;
}

cell中倒计时需要每次加载倒计时先移除倒计时,防止返回或者跳转到下一个界面倒计时还在运行,导致内存崩溃。但是如果在当前页刷新按钮状态比如订单详情,刷新当前页状态改变了,倒计时需要移除,用一下方法。

[_timer invalidate];
2016-06-12 18:47:19 qq_27687119 阅读数 1692
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18851 人正在学习 去看看 邹积超

这里有2个要注意的点
1、这个button初始化时要设为custom类型的(避免倒数秒数时文字闪烁);
2、NSTimer要invalidate掉

声明一个全局timer

 NSTimer *timer;

下面初始化timer调用倒计时方法

sender.tag = 992;
    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(dealYzmBut) userInfo:nil repeats:YES];

下面是调用的方法

#pragma mark --- 点击获取验证码时,验证码按钮倒数计时,倒数完重新发送验证码
static int timeValue = 60;
- (void)dealYzmBut{

    UIButton *sender = (UIButton *)[self.view viewWithTag:992];

    if (timeValue == 0) {
        [sender setBackgroundColor:[UIColor colorWithRed:53/255.0 green:163/255.0 blue:223/255.0 alpha:1]];
        [sender setTitle:@"重新发送" forState:0];
        sender.userInteractionEnabled = YES;
        timeValue = 60;
        [timer invalidate];
        return;
    }

    [sender setBackgroundColor:[UIColor lightGrayColor]];
    sender.userInteractionEnabled = NO;
    [sender setTitle:[NSString stringWithFormat:@"倒计时%ds",timeValue] forState:0];
    timeValue--;
}

“`

2018-02-07 13:51:02 qq_28494649 阅读数 789
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18851 人正在学习 去看看 邹积超

链接:https://pan.baidu.com/s/1i7cSkqL 密码:g80i

  最近给央视做了个H5答题游戏,但在倒计时上遇到一个终端问题:手机端按Home键将微信收入后台之后,IOS11 会继续跑JS五秒钟,注意是5秒,也就是倒计时9的时候收到后台,等1分钟再打开,JS会从4开始倒计时。 听说IOS6的时候能跑10分钟,IOS7有3分钟,IOS11只有5秒....但TM就是个BUG,得改啊(PS,安卓10s能正常跑,我也没试过能跑几秒,也许这就是安卓软件开多了卡爆的原因)。我的选择是获取当前时间戳来解决这个问题,具体代码分析如下:

    function Time_a() {
                var time = 10;
                $(".time").text(time);
                var t = setInterval(function() {
                    if(time == 0) {
                        clearTimeout(t);
                    } else {
                        time--;
                        $(".time").text(time)
                    }
                }, 1000)
            }
 当用time--;来倒计时的时候,在IOS11上面就会出现倒计时断层。因此我选择使用时间戳,再配合后台的时间限制,就可以解决IOS的后台运行时间限制。
 
     function Time_b(){
                var time=10;
                var beginTime=new Date().getTime();
                $(".time-a").text(time);
                var t= setInterval(function(){
                    var newTime=new Date().getTime();
                    var dTime=(newTime-beginTime)/1000;
                    dTime=parseInt(dTime);
                    time = 10-dTime > 0 ? 10-dTime : 0;
                    $(".time-a").text(time);
                },1000)
                
            }


2018-08-16 10:26:46 aiwo035 阅读数 1409
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18851 人正在学习 去看看 邹积超

ios的这个应用退出,js不执行的bug看了好多人写的都有误差,和偏差不是很正确,这个是优化后的

send_verify_code(){ // 验证码倒计时

       this.count=60;//60s倒计时

       this.show_timer=false;//显示文字状态

       this.timerCodeMsg=this.count+' s';//赋值60s

      var beginTime=new Date().getTime();//计算倒计时当前时间

      this.timer=setInterval(() => {//定时器

             var newTime=new Date().getTime();//获取当前时间,假设退出应用

             this.num++;//记入延迟时间1秒的叠加

             var dTime=parseInt((newTime-beginTime)/1000-this.num);//退出应用总共时间

           if (this.count > 0 && this.count <= 60) {

            this.count--;

          //退出应用获取时间在走js不执行如果时间差小于0重置count为0

            if(this.count-parseInt(dTime)<=0){

              this.count=0

              this.timerCodeMsg=(this.count)+' s';

            }else{

             this.timerCodeMsg=(this.count-parseInt(dTime))+' s';

           }

          } else {

           clearInterval(this.timer);

           this.show_timer=true;

           this.timerCodeMsg='重发校验码';

           this.num=0//假设时间差为负数重置为0

           this.timer = null;

         }

    }, 1000)

},

iOS-按钮60s倒计时

阅读数 363

iOS 倒计时按钮

阅读数 1197

没有更多推荐了,返回首页