一个方法实现---倒计时按钮

倒计时功能会经常出现在项目中,通过给UIButton的类别中添加一个方法,在项目中初始化button后调用该方法,就可以很友好的实现倒计时功能了,使用的时候只需要传入一个参数(总时间),然后在方法的后面有两个block 的回调,分别回调当前倒计时和倒计时结束先来看看效果图:

倒计时按钮.gif

下面看看调用地方的代码:

#pragma mark ---开始倒计时点击事件
-(void)startAction{
    NSInteger time =8;
    [_endBt setTitle:[NSString stringWithFormat:@"%zd",time] forState:UIControlStateNormal];
    [_startBt startTime:time waitBlock:^(NSInteger remainTime) {
        DLog(@"%zd",remainTime);
        [_endBt setTitle:[NSString stringWithFormat:@"%zd",remainTime] forState:UIControlStateNormal];
    } finishBlock:^{
        DLog(@"finishBlock");
        [_endBt setTitle:@"倒计时结束" forState:UIControlStateNormal];
    }];
}

UIButton+CountDown.h

@interface UIButton (CountDown)

/**
 倒计时按钮
 
 @param timeout     总时间
 @param waitBlock   倒计时过程中可以再里面做一些操作
 @param finishBlock 完成时执行的block
 */
- (void)startTime:(NSInteger)timeout waitBlock:(void(^)(NSInteger remainTime))waitBlock finishBlock:(void(^)())finishBlock;

@end

UIButton+CountDown.m

@implementation UIButton (CountDown)

- (void)startTime:(NSInteger)timeout waitBlock:(void(^)(NSInteger remainTime))waitBlock finishBlock:(void(^)())finishBlock{
    __block NSInteger timeOut = timeout;
    
    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(), ^{
                if (finishBlock){
                    finishBlock();
                }
                self.userInteractionEnabled = YES;
            });
        }else{
            dispatch_async(dispatch_get_main_queue(), ^{
                if (waitBlock){
                    waitBlock(timeOut);
                }
                self.userInteractionEnabled = NO;
            });
            timeOut--;
        }
    });
    dispatch_resume(_timer);
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,532评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,252评论 4 61
  • 雨后的遂园一派静谧景象,偶尔划过的小船使湖面更加灵动……俗话说,爱好就是特长,所以,看到内涵美好的画面就拍下来,愉...
    云水禅心ZLM阅读 292评论 0 1
  • 等杰哥从家里赶过来,等了一个小时,在冷风中把湿了的背都吹干了。 杰哥赶到的时候,已经接近发车,我们只能快速的拆装单...
    维吉尔丶阅读 196评论 0 0
  • 做选择 犹豫什么呢?那可能是很难选择,那么就添加必要条件,那就可以排除许多不必要的麻烦,很多事情都是这样,既然难的...
    啊貴阅读 122评论 0 0