美文网首页
按钮倒计时

按钮倒计时

作者: BeSt2wazi | 来源:发表于2017-07-13 17:19 被阅读0次
    @interface UIButton (CountDown)
    
    /**
     *
     *  倒计时按钮
     *
     *  @param startTime 倒计时时间
     *  @param title     倒计时结束按钮上显示的文字
     *  @param unitTitle 倒计时的时间单位(默认为s)
     *  @param mColor    按钮的背景色
     *  @param color     倒计时中按钮的背景色
     */
    - (void)countDownFromTime:(NSInteger)startTime title:(NSString *)title unitTitle:(NSString *)unitTitle mainColor:(UIColor *)mColor countColor:(UIColor *)color;
    @end
    
    @implementation UIButton (CountDown)
    - (void)countDownFromTime:(NSInteger)startTime title:(NSString *)title unitTitle:(NSString *)unitTitle mainColor:(UIColor *)mColor countColor:(UIColor *)color {
        
        __weak typeof(self) weakSelf = self;
        
        // 剩余的时间
        __block NSInteger remainTime = startTime;
        
        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_TIME_NOW, 1.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
        
        // 子线程(queue)执行event_handler
        dispatch_source_set_event_handler(timer, ^{
            
            if (remainTime <= 0) { // 倒计时结束
                dispatch_source_cancel(timer);
                // 主线程更新UI
                dispatch_async(dispatch_get_main_queue(), ^{
                    weakSelf.backgroundColor = mColor;
                    [weakSelf setTitle:title forState:UIControlStateNormal];
                    weakSelf.enabled = YES;
                });
            } else {
                NSString *timeStr = [NSString stringWithFormat:@"%ld", remainTime];
                dispatch_async(dispatch_get_main_queue(), ^{
                    weakSelf.backgroundColor = color;
                    [weakSelf setTitle:[NSString stringWithFormat:@"%@%@",timeStr,unitTitle] forState:UIControlStateDisabled];
                    weakSelf.enabled = NO;
                });
                remainTime--;
            }
        });
        dispatch_resume(timer);
    }
    @end
    

    相关文章

      网友评论

          本文标题:按钮倒计时

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