最近工作比较忙,然后最近也在尝试着翻译一篇关于CALayer非常详解的一篇文章,文章还是比较好也比较长的,等整理完了再发布出来吧。所以也没啥多余的时间写些东西,就先来分享一下开发中的一些小Tips吧。
一、倒计时问题
在开发中经常遇到倒计时倒计时问题,写一个Button,然后各种判断各种状态,好多代码感觉很乱,下面就分享一下,一句话解决倒计时问题的例子(当然不是万能的,只适合大部分普通的倒计时_)!
先看效果
http://upload-images.jianshu.io/upload_images/571495-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>