CountDownView的封装

CountDownView的封装

今天在整理以前的代码的时候,把以前的一个控件再次封装了一次,这是一个倒计时的控件,可以用来作为一个进度条来使用。

CountDownView的四个基本类型以及一个自定义类型:
CountDownViewTypeCircle,
CountDownViewTypeRect,
CountDownViewTypeLine,
CountDownViewTypePercent

使用的时候,也是很方便的!
开源代码 - Github

使用的时候的代码

 CountDownView * Circle =[CountDownView countDownViewWithFrame:CGRectMake(10, 40, 140, 140) type:CountDownViewTypeCircle andFinishblock:^(UIView *countDownView, CADisplayLink *link) {
        NSLog(@"%s",__func__);
    }];
    [Circle showInKeyWindowTop];

    CountDownView * Rect =[CountDownView countDownViewWithFrame:CGRectMake(160, 40, 140, 140) type:CountDownViewTypeRect andFinishblock:^(UIView *countDownView, CADisplayLink *link) {
        NSLog(@"%s",__func__);
    }];
    [self.view addSubview:Rect];

    CountDownView * downV =[CountDownView countDownViewWithFrame:CGRectMake(20, 200, 280, 80) type:CountDownViewTypeLine andFinishblock:^(UIView *countDownView, CADisplayLink *link) {
        NSLog(@"%s",__func__);
    }];
    [downV showInKeyWindowTop];

    //CountDownViewTypePercent
    CountDownView * downV1 =[CountDownView countDownViewWithFrame:CGRectMake(20, 300, 280, 40) type:CountDownViewTypePercent andFinishblock:^(UIView *countDownView, CADisplayLink *link) {
        NSLog(@"%s",__func__);
    }];
    [self.view addSubview:downV1];
    downV1.lineWidth = 30;

源码

//
//  CountDownView.h
//  倒计时
//
//  Created by zzz on 15/10/9.
//  Copyright (c) 2015年 zzz. All rights reserved.
//

#import <UIKit/UIKit.h>


typedef void(^FinishCountDownBlock)(UIView *countDownView,CADisplayLink *link);


typedef enum : NSUInteger {
    CountDownViewTypeCircle,
    CountDownViewTypeRect,
    CountDownViewTypeLine,
    CountDownViewTypePercent
} CountDownViewType;

@interface CountDownView : UIView

/**
 *  倒计时最大时间
 */
@property(nonatomic, assign) CGFloat count;                //默认为: 10.00s

/**
 *  当前时间点(可以用作进度条)
 */
@property(nonatomic, assign) CGFloat currentCount;


@property(nonatomic, strong) UIColor * lineColor;           //默认为: Red:0.4 green:0 blue:0.8 alpha:0.6
@property(nonatomic, strong) UIColor * textColor;           //默认为: Red:0 green:0.4 blue:0.8 alpha:0.8
@property(nonatomic, strong) UIFont * textFont;             //默认为: 高度的一半

@property(nonatomic, assign) CGFloat lineWidth;             //默认为: 10.0

@property(nonatomic, assign) BOOL isTouchBegin;             //默认为: YES
@property(nonatomic, assign) BOOL isTouchEnd;               //默认为: YES
@property(nonatomic, assign) BOOL hiddenText;               //默认为: NO

@property(nonatomic, assign) CountDownViewType type;        // 默认为:CountDownViewTypeCircle
@property(nonatomic ,copy) FinishCountDownBlock finishblock;


+ (CountDownView *) countDownViewWithFrame:(CGRect)frame type:(CountDownViewType)type andFinishblock:(FinishCountDownBlock)block;


- (void)setFinishblock:(FinishCountDownBlock)finishblock;

- (void)beginCountDown;

/**
 *  此方法必须要有keyWindow,才有用
 */
- (void)showInKeyWindowTop;

@end

//
//  CountDownView.m
//  倒计时
//
//  Created by zzz on 15/10/9.
//  Copyright (c) 2015年 zzz. All rights reserved.
//

#import "CountDownView.h"


@interface CountDownView ()


@property (nonatomic, strong) CADisplayLink * link;
@property (nonatomic, strong) UILabel * label;

@property(nonatomic, strong) UITapGestureRecognizer * tap;
@property(nonatomic, strong) UITapGestureRecognizer * doubelTap;


@end

@implementation CountDownView


+ (CountDownView *)countDownViewWithFrame:(CGRect)frame type:(CountDownViewType)type andFinishblock:(FinishCountDownBlock)block{
    CountDownView * downV = [[CountDownView alloc] initWithFrame:frame];
    downV.type = type;
    downV.finishblock = block;
    return downV;
}
- (void)beginCountDown{
    [self.link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)showInKeyWindowTop{

    if ([UIApplication sharedApplication].keyWindow) {
        [[UIApplication sharedApplication].keyWindow.rootViewController.view addSubview:self];
    }else{
        NSLog(@"keyWindow = %@",[UIApplication sharedApplication].keyWindow);
    }

}




#pragma mark - 复写方法
- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {

        self.backgroundColor = [UIColor colorWithRed:0.1 green:0.2 blue:0.6 alpha:0.4];

        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(beginAndEndLink)];
        [self addGestureRecognizer:tap];

        self.lineWidth = 10;
        self.count = 10;
        self.lineColor = [UIColor colorWithRed:0 green:0.4 blue:0.8 alpha:0.8];
        self.isTouchBegin = YES;
        self.isTouchEnd = YES;
    }
    return self;
}

- (void)layoutSubviews{
    [super layoutSubviews];

    self.label.frame = self.bounds;
}





// 开始画图
- (void)drawRect:(CGRect)rect{


    if (self.type == CountDownViewTypePercent) {
        self.label.text = [NSString stringWithFormat:@"%0.2f%",(1.0 - (_currentCount / self.count)) * 100];
    }else{

        int index =  (self.count == _currentCount)?(int)_currentCount:(int)_currentCount +1;
        index = _currentCount <= 0 ? 0 : index;
        self.label.text = [NSString stringWithFormat:@"%d",index];

    }

    if (self.type == CountDownViewTypeLine || self.type == CountDownViewTypePercent) {

        // 1.开启上下文
        CGContextRef context = UIGraphicsGetCurrentContext();


        CGFloat Width = CGRectGetWidth(self.bounds);
        CGFloat height = CGRectGetHeight(self.bounds);

        CGFloat Now = Width * (_currentCount / self.count);

        CGContextAddRect(context, CGRectMake(0, height - self.lineWidth -5,Width - Now, self.lineWidth));

        CGContextSetLineWidth(context, self.lineWidth);
        [(self.lineColor)?self.lineColor:[UIColor blackColor] set];

        CGContextSetLineCap(context, kCGLineCapRound);

        CGContextFillPath(context);

        return;
    }
    // 1.开启上下文
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat centerX = CGRectGetMidX(self.bounds);
    CGFloat centerY = CGRectGetMidY(self.bounds);

    CGFloat radius = (CGRectGetWidth(self.bounds) / 2.0) - 10;

    CGFloat startAngle = M_PI * 1.5;

    CGFloat endAngle = startAngle + (M_PI * 2.0) * (_currentCount / self.count);

    // 0 表示顺时针
    CGContextAddArc(context, centerX, centerY, radius, startAngle, endAngle, 0);

    CGContextSetLineWidth(context, self.lineWidth);
    [(self.lineColor)?self.lineColor:[UIColor blackColor] setStroke];

    CGContextSetLineCap(context, kCGLineCapRound);

    CGContextStrokePath(context);
}





#pragma mark - 私有方法
- (void)beginAndEndLink{
    if (_link && self.isTouchEnd) {

        [_link invalidate];
        _link = nil;

        return;

    }else if (_currentCount <= 0 || (!self.isTouchBegin)) {

        return;
    }

    [self.link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}




// 每秒调用60次
- (void) linkLoop{

    [self setNeedsDisplay];

    if (_currentCount <= 0) {
        [_link invalidate];

        if (self.finishblock) {
            self.finishblock(self,_link);
        }
        return;
    }

    _currentCount -= 1 / 60.000000;
}







- (CADisplayLink *)link{
    if (!_link) {
        _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(linkLoop)];

    }
    return _link;
}

- (UILabel *)label{
    if (!_label) {
        _label = [[UILabel alloc] init];
        _label.textAlignment = NSTextAlignmentCenter;
        _label.font = [UIFont systemFontOfSize:self.frame.size.height / 2.0];
        [_label setTextColor:[UIColor colorWithRed:0.4 green:0 blue:0.8 alpha:0.6]];
        [self addSubview:_label];
    }
    return _label;
}



- (void)setTextColor:(UIColor *)textColor{
    _textColor = textColor;
    [self.label setTextColor:_textColor];
}



- (void)setCount:(CGFloat)count{
    _count = count;
    _currentCount = _count;
}
- (void)setCurrentCount:(CGFloat)currentCount{
    _currentCount = currentCount;
    [self setNeedsDisplay];
}


- (void)setTextFont:(UIFont *)textFont{
    _textFont = textFont;
    self.label.font = textFont;
}

- (void)setType:(CountDownViewType)type{
    _type = type;

    if (_type == CountDownViewTypeCircle) {
        self.clipsToBounds = YES;
        self.layer.cornerRadius = self.frame.size.width/2.0;

    } else if (_type == CountDownViewTypeRect){
        self.clipsToBounds = YES;
        self.layer.cornerRadius = 1;

    }else if (_type == CountDownViewTypeRect){


    }
}

- (void)setHiddenText:(BOOL)hiddenText{
    _hiddenText = hiddenText;
    self.label.hidden = _hiddenText;

}


@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值