iOS中一句代码解决倒计时问题

最近工作比较忙,然后最近也在尝试着翻译一篇关于CALayer非常详解的一篇文章,文章还是比较好也比较长的,等整理完了再发布出来吧。所以也没啥多余的时间写些东西,就先来分享一下开发中的一些小Tips吧。

一、倒计时问题
在开发中经常遇到倒计时倒计时问题,写一个Button,然后各种判断各种状态,好多代码感觉很乱,下面就分享一下,一句话解决倒计时问题的例子(当然不是万能的,只适合大部分普通的倒计时_)!
先看效果
http://upload-images.jianshu.io/upload_images/571495-92c1547f64ea24f6.gif?imageMogr2/auto-orient/strip

再看看我们的代码


//
// ViewController.m
// HWCountdownDemo
//
// Created by HenryCheng on 16/1/4.
// Copyright © 2016年 www.igancao.com. All rights reserved.
//

import "ViewController.h"

import "UIButton+countDown.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *countdownBtn;

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];

}

  • (IBAction)countdownBtnClick:(UIButton *)sender {
    [_countdownBtn startWithTime:5 title:@"获取验证码" countDownTitle:@"s" mainColor:[UIColor colorWithRed:84/255.0 green:180/255.0 blue:98/255.0 alpha:1.0f] countColor:[UIColor lightGrayColor]];
    }

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

@end


这里主要的就是xib拉了一个button然后连接了它的属性和方法,我们可以看到就调用了
[_countdownBtn startWithTime:5 title:@"获取验证码" countDownTitle:@"s" mainColor:[UIColor colorWithRed:84/255.0 green:180/255.0 blue:98/255.0 alpha:1.0f] countColor:[UIColor lightGrayColor]];}

这一句代码,就完成了倒计时功能。
这里我写了一个category,里面代码是这样的


//
// UIButton+countDown.m
// LiquoriceDoctorProject
//
// Created by HenryCheng on 15/12/4.
// Copyright © 2015年 iMac. All rights reserved.
//

import "UIButton+countDown.h"

@implementation UIButton (countDown)

  • (void)startWithTime:(NSInteger)timeLine title:(NSString *)title countDownTitle:(NSString *)subTitle mainColor:(UIColor *)mColor countColor:(UIColor *)color {

    //倒计时时间
    __block NSInteger timeOut = timeLine;
    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.backgroundColor = mColor;
              [self setTitle:title forState:UIControlStateNormal];
              self.userInteractionEnabled = YES;
          });
      } else {
          int seconds = timeOut % 60;
          NSString *timeStr = [NSString stringWithFormat:@"%0.2d", seconds];
          dispatch_async(dispatch_get_main_queue(), ^{
              self.backgroundColor = color;
              [self setTitle:[NSString stringWithFormat:@"%@%@",timeStr,subTitle] forState:UIControlStateNormal];
              self.userInteractionEnabled = NO;
          });
          timeOut--;
      }
    

    });
    dispatch_resume(_timer);
    }

@end


关于这个方法的定义

//
// UIButton+countDown.h
// LiquoriceDoctorProject
//
// Created by HenryCheng on 15/12/4.
// Copyright © 2015年 iMac. All rights reserved.
//

import

@interface UIButton (countDown)

/**

  • 倒计时按钮
  • @param timeLine 倒计时总时间
  • @param title 还没倒计时的title
  • @param subTitle 倒计时中的子名字,如时、分
  • @param mColor 还没倒计时的颜色
  • @param color 倒计时中的颜色
    */
  • (void)startWithTime:(NSInteger)timeLine title:(NSString *)title countDownTitle:(NSString *)subTitle mainColor:(UIColor *)mColor countColor:(UIColor *)color;

@end

你可能感兴趣的:(iOS中一句代码解决倒计时问题)