美文网首页
一个方法实现---倒计时按钮

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

作者: 捷风 | 来源:发表于2017-09-14 11:15 被阅读17次

    倒计时功能会经常出现在项目中,通过给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
    

    相关文章

      网友评论

          本文标题:一个方法实现---倒计时按钮

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