美文网首页我喜欢的技术篇iOS DeveloperiOS
iOS获取短信验证码倒计时的两种方法

iOS获取短信验证码倒计时的两种方法

作者: APP叫我取个帅气的昵称 | 来源:发表于2016-11-08 13:29 被阅读215次

    方法一:

    网上用的很多的一种,不多说,直接上代码.

    -(void)startTime{
        __block int timeout= 60; //倒计时时间
        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(), ^{
                    [self.getIdentifyCodeBt setTitle:@"获取验证码" forState:UIControlStateNormal];
                    self.getIdentifyCodeBt.userInteractionEnabled = YES;
                    [self.getIdentifyCodeBt setTitleColor:THEME_RED forState:UIControlStateNormal];
                    self.getIdentifyCodeBt.backgroundColor = [UIColor whiteColor];
                    self.getIdentifyCodeBt.layer.borderColor = THEME_RED.CGColor;
                });
            }else{
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    [UIView beginAnimations:nil context:nil];
                    [UIView setAnimationDuration:1];
                    [self.getIdentifyCodeBt setTitle:[NSString stringWithFormat:@"%zd秒后失效",timeout] forState:UIControlStateNormal];
                    [self.getIdentifyCodeBt setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
                    self.getIdentifyCodeBt.backgroundColor = [UIColor lightGrayColor];
                    self.getIdentifyCodeBt.layer.borderColor = [UIColor clearColor].CGColor;
                    self.getIdentifyCodeBt.clipsToBounds = YES;
                    [UIView commitAnimations];
                    self.getIdentifyCodeBt.userInteractionEnabled = NO;
                });
                timeout--;
            }
        });
        dispatch_resume(_timer);
        
    }```
    到时直接调用就可以了。
    ####方法二:利用分类
    给UIButton新建一个分类
    .h文件如下
    

    import <UIKit/UIKit.h>

    @interface UIButton (XSCountDown)

    • (void)xs_beginCountDownWithDuration:(NSTimeInterval)duration;
    • (void)xs_stopCountDown;
      @end
    .m文件如下
    

    import "UIButton+XSCountDown.h"

    import "ThemeColor.h"

    static NSTimer *_countTimer;
    static NSTimeInterval _count;
    static NSString *_title;

    @implementation UIButton (XSCountDown)

    • (void)xs_beginCountDownWithDuration:(NSTimeInterval)duration {
      _title = self.titleLabel.text;
      _count = duration;
      _countTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(xs_updateTitle) userInfo:nil repeats:YES];
      [[NSRunLoop mainRunLoop] addTimer:_countTimer forMode:NSRunLoopCommonModes];
      self.userInteractionEnabled = NO;

      [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
      self.backgroundColor = [UIColor lightGrayColor];
      self.layer.borderColor = [UIColor clearColor].CGColor;
      self.clipsToBounds = YES;
      }

    • (void)xs_stopCountDown {
      [_countTimer invalidate];
      _countTimer = nil;
      _count = 60.0;
      [self setTitle:_title forState:UIControlStateNormal];
      self.userInteractionEnabled = YES;
      }

    • (void)xs_updateTitle {
      NSString *countString = [NSString stringWithFormat:@"%lis 后失效", (long)_count - 1];
      self.userInteractionEnabled = NO;
      [self setTitle:countString forState:UIControlStateNormal];
      if (_count-- <= 1.0) {
      [self xs_stopCountDown];
      [self setTitleColor:THEME_RED forState:UIControlStateNormal];
      self.backgroundColor = [UIColor whiteColor];
      self.layer.borderColor = THEME_RED.CGColor;
      }

    }

    @end

    然后在controller里直接调用分类.h文件里的方法就ok了
    

    [self.verifyBt xs_beginCountDownWithDuration:60.0];

    相关文章

      网友评论

      本文标题:iOS获取短信验证码倒计时的两种方法

      本文链接:https://www.haomeiwen.com/subject/yrmauttx.html