前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CAGradientLayer颜色渐变器

CAGradientLayer颜色渐变器

作者头像
周希
发布2019-10-15 01:16:12
1.3K0
发布2019-10-15 01:16:12
举报
文章被收录于专栏:APP自动化测试APP自动化测试

使用CAGradientLayer可以实现颜色的渐变, 我们先看下头文件

代码语言:javascript
复制
@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

上代码:

代码语言:javascript
复制
#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来实现动画

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-01-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档