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

2017-09-14  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读