美文网首页
iOS中一句代码解决倒计时问题

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

作者: UILabelkell | 来源:发表于2016-01-06 21:22 被阅读123次

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

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

再看看我们的代码
<pre>
//
// 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
</pre>
这里主要的就是xib拉了一个button然后连接了它的属性和方法,我们可以看到就调用了
<pre>[_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]];}</pre>

这一句代码,就完成了倒计时功能。
这里我写了一个category,里面代码是这样的
<pre>
//
// 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
</pre>
关于这个方法的定义
<pre>
//
// UIButton+countDown.h
// LiquoriceDoctorProject
//
// Created by HenryCheng on 15/12/4.
// Copyright © 2015年 iMac. All rights reserved.
//

import <UIKit/UIKit.h>

@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
</pre>

相关文章

网友评论

      本文标题:iOS中一句代码解决倒计时问题

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