[ios]按钮倒计时

1.Android下方法:

使用 CountDownTimer Class

new CountDownTimer(getResources().getInteger(R.integer.change_count_max_value) * 1000, 1000) {

                public void onTick(long millisUntilFinished) {
                    valueCode.setText("" + (int)(millisUntilFinished/1000));
                }

                public void onFinish() {
                    //timeOutFlag = true;
                    valueCode.setText(R.string.get_code);

                    changeButton.setEnabled(true);
                }
            }.start();
        }
    }
});

 

2.IOS下:

思路:

  • 创建按钮, 添加点击方法;
  • 用NSTimer定时器, 每秒执行一次, 定时改变Button的title,改变Button的样式, 设置Button不可点击;
  • 若倒计时结束, 定时器关闭, 并改变Button的样式, 可以点击;

在按钮的点击事件里调用该方法:

-(void)openCountDonw{
     __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_walltime(NULL, 0),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(), ^{
                
                //设置按钮的样式
                [_getCode setTitle:NSLocalizedString(@"get_code", @"") forState:UIControlStateNormal];
                _getCode.userInteractionEnabled = YES;
            });
            
        }else{
            
            int seconds = time % 60;
            dispatch_async(dispatch_get_main_queue(), ^{
                
                //设置按钮显示读秒效果
                [_getCode setTitle:[NSString stringWithFormat:@"%.2d", seconds] forState:UIControlStateNormal];
                [_getCode setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
                _getCode.userInteractionEnabled = NO;
            });
            time--;
        }
    });
    dispatch_resume(_timer);
}

 

注意点:

 

我们在创建Button时, 要设置Button的样式:
当type为: UIButtonTypeCustom时 , 是读秒的效果.
当type为: 其他时, 是一闪一闪的效果.

 

概念:

1.__block:Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上__block修饰符。上述NSInteger time 变量在Block外部定义,在Block内使用了time--;

2. userInteractionEnabled:当前视图设为view.userInteractionEnabled=NO 时,当前视图不可交互,该视图上面的子视图也不可与用户交互(不可响应即被该视图忽视),响应事件传递到下面的父视图。此时其他按钮都不能点击。

3.dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //获得程序进程缺省产生的并发队列,可设定优先级来选择高、中、低三个优先级队列。由于是系统默认生成的,所以无法调用dispatch_resume()和dispatch_suspend()来控制执行继续或中断。需要注意的是,三个队列不代表三个线程,可能会有更多的线程。并发队列可以根据实际情况来自动产生合理的线程数,也可理解为dispatch队列实现了一个线程池的管理,对于程序逻辑是透明的。

4.dispatch_source_t:精度比NSTimer高的计时器,系统自动触发,系统级别的源。

5.dispatch_resume():恢复队列 dispatch_source_cancel:取消队列

 

6.dispatch_async(queue,block)  async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行

 

参考:

1.iOS 短信验证码倒计时按钮的实现:http://www.cnblogs.com/leixu/articles/5457580.html

2. userInteractionEnabled : http://www.jianshu.com/p/febef5ce9adc

3.GCD基础知识集合:http://www.jianshu.com/p/1f48eb97922b

4.计时器:http://www.jianshu.com/p/faa6ffe4fac3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值