CAGradientLayer顏色漸變器


使用CAGradientLayer可以實現顏色的漸變, 我們先看下頭文件

@interface CAGradientLayer : CALayer

@property(nullable, copy) NSArray *colors;
//顏色漸變的數組 @property(nullable, copy) NSArray
<NSNumber *> *locations;
//漸變顏色的區間分布,locations的數組長度和color一致,默認是nil,會平均分布 @property CGPoint startPoint;
//映射locations中第一個位置,用單位向量表示,比如(0,0)表示從左上角開始變化。默認值是(0.5,0.0)
@property CGPoint endPoint; //映射locations中最后一個位置,用單位向量表示,比如(1,1)表示到右下角變化結束。默認值是(0.5,1.0)
@property(copy) NSString
*type; //默認值是kCAGradientLayerAxial,表示按像素均勻變化。除了默認值也無其它選項
@end

下面是我用上面的代碼實現的最終效果,startPoint是(0,0),endPoint是(1,1)。

 

下面我們試試用這個來實現一個漸變色的圓環, 

需要說明的是CAGradientLayer只能實現矩形范圍內的顏色漸變, 那漸變的圓環要如何實現呢? mask 對了

 

首先我們創建兩個挨着的矩形漸變色塊, 並把兩個色塊添加到同一個layer

 

再創建一個帶有圓弧形狀的layer作為mask

上代碼:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //創建圓弧路徑
    UIBezierPath * path      = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) radius:45 startAngle:- 7.0 / 6 * M_PI endAngle:M_PI / 6 clockwise:YES];
    
    //添加圓弧Layer
    [self.view.layer addSublayer:[self createShapeLayerWithPath:path]];
    
    //配置左色塊CAGradientLayer
    CAGradientLayer * leftL  = [self createGradientLayerWithColors:@[(id)[UIColor redColor].CGColor,(id)[UIColor yellowColor].CGColor]];
    leftL.position           = CGPointMake(25, 40);
    
    //配置右色塊CAGradientLayer
    CAGradientLayer * rightL = [self createGradientLayerWithColors:@[(id)[UIColor greenColor].CGColor,(id)[UIColor yellowColor].CGColor]];
    rightL.position          = CGPointMake(75, 40);
    
    //將兩個色塊拼接到同一個layer並添加到self.view
    CALayer * layer          = [CALayer layer];
    layer.bounds             = CGRectMake(0, 0, 100, 80);
    layer.position           = self.view.center;
    [layer addSublayer:leftL];
    [layer addSublayer:rightL];
    [self.view.layer addSublayer:layer];
    
    //創建一個ShapeLayer作為mask
    CAShapeLayer * mask = [self createShapeLayerWithPath:path];
    mask.position       = CGPointMake(50, 40);
    layer.mask          = mask;
    //mask.strokeEnd = 1;
}

//依照路徑創建並返回一個CAShapeLayer
-(CAShapeLayer *)createShapeLayerWithPath:(UIBezierPath *)path {
    
    CAShapeLayer * layer = [CAShapeLayer layer];
    layer.path           = path.CGPath;
    layer.bounds         = CGRectMake(0, 0, 100, 75);
    layer.position       = self.view.center;
    layer.fillColor      = [UIColor clearColor].CGColor;
    layer.strokeColor    = [UIColor colorWithRed:33 / 255.0 green:192 / 255.0 blue:250 / 255.0 alpha:1].CGColor;
    layer.lineCap        = @"round";
    layer.lineWidth      = 10;
    
    return layer;
}

//依照給定的顏色數組創建並返回一個CAGradientLayer
-(CAGradientLayer *)createGradientLayerWithColors:(NSArray *)colors {
    
    CAGradientLayer * gradientLayer = [CAGradientLayer layer];
    gradientLayer.colors            = colors;
    gradientLayer.locations         = @[@0,@0.8];
    gradientLayer.startPoint        = CGPointMake(0, 1);
    gradientLayer.endPoint          = CGPointMake(0, 0);
    gradientLayer.bounds            = CGRectMake(0, 0, 50, 80);
    
    return gradientLayer;
}

@end

可以改變mask的strokeEnd來實現動畫

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM