zoukankan      html  css  js  c++  java
  • [控件] ColorfulProgressView

    ColorfulProgressView

    效果

    说明

    1. 支持颜色定制

    2. 进度条动画可以自己控制

    3. 简单易用

    源码

    https://github.com/YouXianMing/UI-Component-Collection

    //
    //  ColorfulProgressView.h
    //  ColorfulProgressView
    //
    //  Created by YouXianMing on 15/7/13.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    #import "ProgressColor.h"
    
    @interface ColorfulProgressView : UIView
    
    /**
     *  进度
     */
    @property (nonatomic) CGFloat progress;
    
    /**
     *  进度颜色(不设置的话有默认值)
     */
    @property (nonatomic, strong) ProgressColor *progressColor;
    
    /**
     *  配置生效以及开始运行
     */
    - (void)configAvailableAndBegin;
    
    /**
     *  便利构造器方法
     *
     *  @param frame         尺寸
     *  @param progressColor 颜色值,可以为空
     *
     *  @return 实例对象
     */
    + (instancetype)colorfulProgressViewWithFrame:(CGRect)frame progressColor:(ProgressColor *)progressColor;
    
    @end
    //
    //  ColorfulProgressView.m
    //  ColorfulProgressView
    //
    //  Created by YouXianMing on 15/7/13.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "ColorfulProgressView.h"
    
    @interface ColorfulProgressView () {
    
        /**
         *  当前view宽度
         */
        CGFloat _width;
        
        /**
         *  当前view高度
         */
        CGFloat _height;
    }
    
    @property (nonatomic, strong) UIView          *baseView;
    @property (nonatomic, strong) CAGradientLayer *gradientLayer;
    
    @end
    
    @implementation ColorfulProgressView
    
    #pragma mark - 初始化与初始设置
    - (instancetype)initWithFrame:(CGRect)frame {
        
        self = [super initWithFrame:frame];
        
        if (self) {
            
            [self setup];
        }
        
        return self;
    }
    
    - (void)setup {
    
        _width    = self.frame.size.width;
        _height   = self.frame.size.height;
        
        // baseView
        self.baseView                     = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, _height)];
        self.baseView.layer.masksToBounds = YES;
        [self addSubview:self.baseView];
        
        // 渐变色Layer
        self.gradientLayer            = [CAGradientLayer layer];
        self.gradientLayer.frame      = self.bounds;
        [self.baseView.layer addSublayer:self.gradientLayer];
    }
    
    #pragma mark - 
    - (void)configAvailableAndBegin {
    
        // 如果没有设置ProgressColor,则自己生成一个
        if (_progressColor == nil) {
            
            _progressColor = [ProgressColor new];
            
            NSMutableArray *cgColors = [NSMutableArray array];
            for (NSInteger deg = 0; deg <= 360; deg += 5) {
                UIColor *color = [UIColor colorWithHue:1.0 * deg / 360.0 saturation:1.0 brightness:1.0 alpha:1.0];
                [cgColors addObject:(id)[color CGColor]];
            }
            
            _progressColor.cgColors = cgColors;
        }
        
        
        self.gradientLayer.colors     = _progressColor.cgColors;
        self.gradientLayer.startPoint = _progressColor.startPoint;
        self.gradientLayer.endPoint   = _progressColor.endPoint;
        
        
        [self doAnimation];
    }
    
    - (void)doAnimation {
        
        NSArray *fromColors           = _progressColor.cgColors;
        NSArray *toColors             = [_progressColor accessColors];
        _progressColor.cgColors       = toColors;
        
        CABasicAnimation *animation   = [CABasicAnimation animationWithKeyPath:@"colors"];
        
        animation.fromValue           = fromColors;
        animation.toValue             = toColors;
        animation.duration            = _progressColor.duration;
        
        animation.removedOnCompletion = YES;
        animation.fillMode            = kCAFillModeForwards;
        animation.timingFunction      = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        animation.delegate            = self;
        
        self.gradientLayer.colors     = toColors;
        
        [self.gradientLayer addAnimation:animation forKey:@"animateGradient"];
    }
    
    #pragma mark - 动画代理
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
        
        [self doAnimation];
    }
    
    #pragma mark - 便利构造器
    + (instancetype)colorfulProgressViewWithFrame:(CGRect)frame progressColor:(ProgressColor *)progressColor {
    
        ColorfulProgressView *progressView = [[self alloc] initWithFrame:frame];
        
        if (progressColor) {
            progressView.progressColor = progressColor;
        }
        
        [progressView configAvailableAndBegin];
        
        return progressView;
    }
    
    #pragma mark - 重写getter,setter方法
    @synthesize progress = _progress;
    - (void)setProgress:(CGFloat)progress {
    
        _progress = progress;
        
        if (progress <= 0) {
            _baseView.frame = CGRectMake(0, 0, 0, _height);
        } else if (progress <= 1) {
            _baseView.frame = CGRectMake(0, 0, _progress * _width, _height);
        } else {
            _baseView.frame = CGRectMake(0, 0, _width, _height);
        }
    }
    
    - (CGFloat)progress {
    
        return _progress;
    }
    
    @end
    //
    //  ProgressColor.h
    //  ColorfulProgressView
    //
    //  Created by YouXianMing on 15/7/13.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    @interface ProgressColor : NSObject
    
    /**
     *  存储的是CGColor的数组元素
     */
    @property (nonatomic, strong) NSArray *cgColors;
    
    /**
     *  颜色起始点
     */
    @property (nonatomic) CGPoint startPoint;
    
    /**
     *  颜色结束点
     */
    @property (nonatomic) CGPoint endPoint;
    
    /**
     *  颜色移位一次的动画时间
     */
    @property (nonatomic) NSTimeInterval duration;
    
    /**
     *  -----------[ 子类可以重写该方法 ]-----------
     *
     *  转换颜色的算法
     *
     *  @return 移位后的颜色数组
     */
    - (NSArray *)accessColors;
    
    #pragma mark - 便利构造器方法(自己添加方法)
    + (ProgressColor *)redGradientColor;
    
    + (ProgressColor *)yellowGradientColor;
    
    @end
    //
    //  ProgressColor.m
    //  ColorfulProgressView
    //
    //  Created by YouXianMing on 15/7/13.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "ProgressColor.h"
    
    @implementation ProgressColor
    
    #pragma mark - 默认配置
    - (instancetype)init {
        self = [super init];
        if (self) {
            
            [self setup];
        }
        
        return self;
    }
    
    - (void)setup {
        
        self.startPoint = CGPointMake(0.f, 0.5f);
        self.endPoint   = CGPointMake(1.f, 0.5f);
        self.duration   = 0.1f;
    }
    
    #pragma mark - 切换颜色的算法
    - (NSArray *)accessColors {
        
        NSMutableArray *mutable = [_cgColors mutableCopy];
        
        id last = [mutable lastObject];
        [mutable removeLastObject];
        [mutable insertObject:last atIndex:0];
        
        NSArray *colors = [NSArray arrayWithArray:mutable];
        
        return colors;
    }
    
    #pragma mark - 便利构造器
    + (ProgressColor *)redGradientColor {
        
        ProgressColor *color = [ProgressColor new];
        
        NSMutableArray *cgColors = [NSMutableArray array];
        
        [cgColors addObject:(id)[[UIColor colorWithRed:0.2f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.2f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.3f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.4f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.5f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.6f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.7f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.8f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.9f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:1.0f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.9f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.8f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.7f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.6f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.5f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.4f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.3f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.2f green:0.f blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0.2f green:0.f blue:0.f alpha:1.f] CGColor]];
        
        
        color.cgColors = cgColors;
        color.duration = 0.1f;
        
        return color;
    }
    
    + (ProgressColor *)yellowGradientColor {
    
        
        ProgressColor *color = [ProgressColor new];
        
        NSMutableArray *cgColors = [NSMutableArray array];
        
        [cgColors addObject:(id)[[UIColor colorWithRed:0 green:0.1 blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0 green:0.2 blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0 green:0.3 blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0 green:0.3 blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0 green:0.2 blue:0.f alpha:1.f] CGColor]];
        [cgColors addObject:(id)[[UIColor colorWithRed:0 green:0.1 blue:0.f alpha:1.f] CGColor]];
        
        
        color.cgColors = cgColors;
        color.duration = 0.5f;
        
        return color;
    }
    
    @end

    细节

  • 相关阅读:
    urllib使用四--urlencode,urlparse,
    urllib使用三--urlretrieve下载文件
    urllib使用二
    urllib使用一
    python使用网易邮箱发邮件
    python QQ邮件发送邮件
    可以字符串string转化成list,tuple,dict的eval()方法
    一行代码将两个列表拼接出第三个列表(两个可迭代对象相加产生第三个可迭代对象)--map()方法
    把列表中的元素拼接成字符串
    Runtime 类
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4643887.html
Copyright © 2011-2022 走看看