CAGradientLayer實(shí)現(xiàn)絢麗彩色進(jìn)度條

效果(gif掉真實(shí)際效果可以運(yùn)行demo):


demo已經(jīng)放在GitHub,里面有更多動畫效果虫腋,在不斷更新田晚,歡迎下載查看,有幫助可以star智润,謝謝及舍!
時(shí)間問題原理在這里不再多敘述,具體實(shí)際實(shí)現(xiàn)見代碼:

LRProgressColor.h

#import <Foundation/Foundation.h>

@interface LRProgressColor : NSObject

/**
 存儲的是CGColor的數(shù)組元素
 */
@property (nonatomic, strong)NSArray *cgColors;

/**
 顏色起始點(diǎn)
 */
@property (nonatomic, assign)CGPoint startPoint;

/**
 顏色結(jié)束點(diǎn)
 */
@property (nonatomic, assign)CGPoint endPoint;

/**
 顏色移位一次的動畫時(shí)間
 */

@property (nonatomic, assign)NSTimeInterval duration;

/**
 *  -----------[ 子類可以重寫該方法 ]-----------
 *
 *  轉(zhuǎn)換顏色的算法
 *
 *  @return 移位后的顏色數(shù)組
 */
- (NSArray *)accessColors;

#pragma mark - 便利構(gòu)造器方法(自己添加方法) --

+ (instancetype)redGradientColor;

@end

LRProgressColor.m

#import "LRProgressColor.h"

@implementation LRProgressColor

- (instancetype)init{
    if (self = [super init]) {
        
        self.startPoint = CGPointMake(0.f, 0.5f);
        self.endPoint   = CGPointMake(1.f, 0.5f);
        self.duration   = 0.1f;
        
    }
    return self;
}

- (NSArray *)accessColors{
    
    NSMutableArray *mutableArr = [_cgColors mutableCopy];
    //第一個(gè)和最后一個(gè)顏色交換實(shí)現(xiàn)位移
    id last = mutableArr.lastObject;
    [mutableArr removeLastObject];
    [mutableArr insertObject:last atIndex:0];
    
    NSArray *colors = [NSArray arrayWithArray:mutableArr];
    return colors;
}

+ (instancetype)redGradientColor{
    
    LRProgressColor *color = [[self alloc] init];
    
    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;
}


@end

LRColorFullProgressView.h

#import <UIKit/UIKit.h>
#import "LRProgressColor.h"

@interface LRColorFullProgressView : UIView


/**
 進(jìn)度
 */
@property (nonatomic, assign)CGFloat progress;


/**
 進(jìn)度顏色
 */
@property (nonatomic, strong)LRProgressColor *progressColor;



/**
 配置生效以及開始運(yùn)行
 */
- (void)configAvailableAndBegin;


/**
 便利構(gòu)造器方法

 @param  frame         尺寸
 @param  progressColor 顏色值,可以為空
 @return 實(shí)例對象
 */
+ (instancetype)colorfulProgressViewWithFrame:(CGRect)frame progressColor:(LRProgressColor *)progressColor;
@end

LRColorFullProgressView.m

#import "LRColorFullProgressView.h"

@interface LRColorFullProgressView()<CAAnimationDelegate>{
    
    /**
     *  當(dāng)前view寬度
     */
    CGFloat _width;
    
    /**
     *  當(dāng)前view高度 用于記錄原始高度
     */
    CGFloat _height;
}

@property (nonatomic, strong)UIView *baseView;

@property (nonatomic, strong)CAGradientLayer *gradientLayer;

@end

@implementation LRColorFullProgressView

- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        
        _width = self.frame.size.width;
        _height = self.frame.size.height;
        
        // baseView
        self.baseView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, _height)];
        _baseView.layer.masksToBounds = YES;
        [self addSubview:_baseView];
        
        // gradientLayer
        self.gradientLayer = [CAGradientLayer layer];
        _gradientLayer.frame = self.bounds;
        [self.baseView.layer addSublayer:_gradientLayer];
        
        
    }
    return self;
}

- (void)configAvailableAndBegin{
    
    // 如果沒有設(shè)置ProgressColor,則自己生成一個(gè)
    if (_progressColor == nil) {
        
        _progressColor = [[LRProgressColor alloc] init];
        
        NSMutableArray *cgColors = [NSMutableArray array];
        for (NSInteger i = 0; i < 360; i+=5) {
            //指定HSB窟绷,參數(shù)是:色調(diào)(hue)锯玛,飽和的(saturation),亮度(brightness)
            UIColor *color = [UIColor colorWithHue:i/360.0 saturation:1.0 brightness:1.0 alpha:1.0];
            [cgColors addObject:(__bridge id)color.CGColor];
        }
        _progressColor.cgColors = cgColors;
    }
    
    _gradientLayer.colors = _progressColor.cgColors;
    _gradientLayer.startPoint = _progressColor.startPoint;
    _gradientLayer.endPoint = _progressColor.endPoint;
    
    [self animation];
}

- (void)animation{
    
    NSArray *fromColors = _progressColor.cgColors;
    //獲取最后一幀
    NSArray *toClors = [_progressColor accessColors];
    _progressColor.cgColors = toClors;
    
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"colors"];
    animation.fromValue = fromColors;
    animation.toValue = toClors;
    animation.duration = _progressColor.duration;
    animation.fillMode = kCAFillModeForwards;
    animation.removedOnCompletion = YES;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animation.delegate = self;
    //layerhuadh
    //防止復(fù)原 removedOnCompletion == YES 則需要設(shè)置動畫完后最終顏色
    _gradientLayer.colors = toClors;
    [_gradientLayer addAnimation:animation forKey:@"colorsAnimation"];

}

#pragma mark-- CAAnimationDelegate --

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
    [self animation];
}

+ (instancetype)colorfulProgressViewWithFrame:(CGRect)frame progressColor:(LRProgressColor *)progressColor{
    
    LRColorFullProgressView *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, _width*progress, _height);
    }else{
        _baseView.frame = CGRectMake(0, 0, _width, _height);
    }
}

- (CGFloat)progress{
    return _progress;
}
@end

控制器調(diào)用:

#import "LRColorProgressController.h"
#import "LRColorFullProgressView.h"
#import "LRProgressColor.h"

@interface LRColorProgressController ()

@property (nonatomic, strong)GCDTimer *timer;

@property (nonatomic, strong)LRColorFullProgressView *progressView0;

@property (nonatomic, strong)LRColorFullProgressView *progressView1;

@end

@implementation LRColorProgressController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    
    /*
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(0, 80, 100, 200);
    [self.view.layer addSublayer:gradientLayer];
    gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,
                             (__bridge id)[UIColor greenColor].CGColor,
                             (__bridge id)[UIColor blueColor].CGColor];
    gradientLayer.locations = @[@0.25,@0.5,@0.75];
    gradientLayer.startPoint = CGPointMake(0, 0.5);
    gradientLayer.endPoint = CGPointMake(1, 0.5);
     */
    
    // progressView0
    self.progressView0 = [LRColorFullProgressView colorfulProgressViewWithFrame:CGRectMake(0, 160, self.view.width, 2.f)
                                                                  progressColor:nil];
    
    [self.view addSubview:self.progressView0];
    
    // progressView1
    self.progressView1 = [LRColorFullProgressView colorfulProgressViewWithFrame:CGRectMake(0, 180, self.view.width, 2.f)
                                                                  progressColor:[LRProgressColor redGradientColor]];
    
    [self.view addSubview:self.progressView1];
    
    // timer
    _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
    [_timer event:^{
        
        CGFloat percent0 = arc4random() % 101 / 100.f;
        CGFloat percent1 = arc4random() % 101 / 100.f;
        [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:1.f initialSpringVelocity:0 options:0 animations:^{
            _progressView0.progress = percent0;
            _progressView1.progress = percent1;
        } completion:^(BOOL finished) {
            
        }];
    } timeInterval:NSEC_PER_SEC];
    [_timer start];
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攘残,隨后出現(xiàn)的幾起案子拙友,更是在濱河造成了極大的恐慌,老刑警劉巖歼郭,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遗契,死亡現(xiàn)場離奇詭異,居然都是意外死亡病曾,警方通過查閱死者的電腦和手機(jī)牍蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泰涂,“玉大人鲫竞,你說我怎么就攤上這事”泼桑” “怎么了从绘?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長是牢。 經(jīng)常有香客問我僵井,道長,這世上最難降的妖魔是什么妖泄? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任驹沿,我火速辦了婚禮,結(jié)果婚禮上蹈胡,老公的妹妹穿的比我還像新娘渊季。我一直安慰自己,他們只是感情好罚渐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布却汉。 她就那樣靜靜地躺著,像睡著了一般荷并。 火紅的嫁衣襯著肌膚如雪合砂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天源织,我揣著相機(jī)與錄音翩伪,去河邊找鬼。 笑死谈息,一個(gè)胖子當(dāng)著我的面吹牛缘屹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侠仇,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼轻姿,長吁一口氣:“原來是場噩夢啊……” “哼犁珠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起互亮,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤犁享,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后豹休,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炊昆,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年威根,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窑眯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡医窿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炊林,到底是詐尸還是另有隱情姥卢,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布渣聚,位于F島的核電站独榴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奕枝。R本人自食惡果不足惜棺榔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隘道。 院中可真熱鬧症歇,春花似錦、人聲如沸谭梗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽激捏。三九已至设塔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間远舅,已是汗流浹背闰蛔。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留图柏,地道東北人序六。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像爆办,于是被迫代替她去往敵國和親难咕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容