CountDownView的封装

来源:互联网 发布:js跳出each循环函数 编辑:程序博客网 时间:2024/06/05 17:53

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
0 0
原创粉丝点击