OCiOS开发:CAGradientLayer 渐变色

CAGradientLayer 简介

  • CAGradientLayer是CALayer图层类的子类,用于处理渐变色的层结构。

  • CAGradientLayer的渐变色可以做隐式动画。

  • CAGradientLayer和CAShapeLayer配合使用可实现复杂效果。

  • CAGradientLayer可以用作PNG的遮罩效果。

CAGradientLayer 坐标系统

  • CAGradientLayer的坐标系统是从坐标(0,0)到(1,1)绘制的矩形。

  • CAGradientLayer的frame值的size不为正方形的话,坐标系统会被拉伸。

  • CAGradientLayer的startPoint与endPoint会直接影响颜色的绘制方向。

  • CAGradientLayer的颜色分割点是以0~1的比例来计算的,颜色分割点为渐变色开始或终止的地方。

    这里写图片描述

CAGradientLayer 属性介绍

  • colors:渐变颜色数组

  • locations:渐变颜色的区间分布(分割点),locations的数组长度和colors一致。这个属性可不设,默认是nil,系统会平均分布颜色如果有特定需要可设置,数组设置为0 ~ 1之间单调递增。

  • startPoint:映射locations中起始位置,用单位向量表示。比如(0, 0)表示从左上角开始变化。默认值是:(0.5, 0.0)

  • endPoint:映射locations中结束位置,用单位向量表示。比如(1, 1)表示到右下角变化结束。默认值是:(0.5, 1.0)

  • type:默认值是kCAGradientLayerAxial,表示按像素均匀变化。

CAGradientLayer 案例

三原色渐变

  • 效果展示

    这里写图片描述

  • 代码示例

- (void)viewDidLoad {

    [super viewDidLoad];

    /**< 初始化colorsView */
    UIView *colorsView = [[UIView alloc] init];
    colorsView.bounds = CGRectMake(0, 0, 220, 220);
    colorsView.center = self.view.center;
    [self.view addSubview:colorsView];

    /**< 初始化渐变层 */
    CAGradientLayer *gradientColorLayer = [CAGradientLayer layer];
    gradientColorLayer.frame = colorsView.bounds;
    [colorsView.layer addSublayer:gradientColorLayer];

    /**< 设置颜色组 */
    gradientColorLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,
                                  (__bridge id)[UIColor greenColor].CGColor,
                                  (__bridge id)[UIColor blueColor].CGColor];

    /**< 设置颜色分割点 */
    gradientColorLayer.locations  = @[@(0.25), @(0.5), @(0.75)];


    /**< 设置渐变颜色方向 */
    // 1、起始位置
    gradientColorLayer.startPoint = CGPointMake(0, 0);
    // 2、结束位置
    gradientColorLayer.endPoint   = CGPointMake(0, 1);

}

分割点动画

  • 效果展示

    这里写图片描述

  • 代码示例

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) CAGradientLayer *gradientLayer;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    // 添加 CAGradientLayer
    [self.view.layer addSublayer:self.gradientLayer];

    // 延时3秒执行,实现分割点动画(隐式动画)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 颜色分割点效果
        self.gradientLayer.locations = @[@(0.4), @(0.5), @(0.6)];
    });

}

#pragma mark - Getter methods

- (CAGradientLayer *)gradientLayer {
    if (!_gradientLayer) {
        // 初始化并创建
        _gradientLayer             = [CAGradientLayer layer];
        _gradientLayer.frame       = CGRectMake(0, 0, 250, 250);
        _gradientLayer.position    = self.view.center;
        _gradientLayer.borderWidth = 1.f;

        // 设置颜色
        _gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,
                                  (__bridge id)[UIColor greenColor].CGColor,
                                  (__bridge id)[UIColor blueColor].CGColor];

        // 设置颜色渐变方向
        _gradientLayer.startPoint = CGPointMake(0, 0);
        _gradientLayer.endPoint   = CGPointMake(1, 0);

        // 设置颜色分割点
        _gradientLayer.locations  = @[@(0.25), @(0.5), @(0.75)];
    }
    return _gradientLayer;
}

@end

色差动画

  • 实现思路

    • 确定渐变色渐变方向;

    • 至少设定两种颜色,此处设置两种颜色为例,其中一种是透明色,另外一种是自定义颜色。

    • 设定好locations颜色分割点。

  • 效果展示

    这里写图片描述

  • 代码示例

#import "ViewController.h"

@interface ViewController () {

    NSTimer *_timer; /**< 定时器 */
}

@property (strong, nonatomic) CAGradientLayer *gradientLayer; /**< 渐变层 */

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blackColor];

    // 创建背景图片
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
    imageView.bounds       = CGRectMake(0, 0, 260, 450);
    imageView.center       = self.view.center;
    [self.view addSubview:imageView];

    // 添加渐变层
    [imageView.layer addSublayer:self.gradientLayer];

    // 初始化定时器
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.f
                                              target:self
                                            selector:@selector(respondsToTimerEvent)
                                            userInfo:nil
                                             repeats:YES];


}

#pragma mark - Timer and animations methods
- (void)respondsToTimerEvent {
    // 设定颜色组动画
    self.gradientLayer.colors = @[(__bridge id)[UIColor clearColor].CGColor,
                                  (__bridge id)[UIColor colorWithRed:arc4random()%255 / 255.f
                                                               green:arc4random()%255 / 255.f
                                                                blue:arc4random()%255 / 255.f
                                                               alpha:1].CGColor];
    // 设置颜色分割点动画
    self.gradientLayer.locations = @[@(arc4random() %10 / 10.f), @(1.f)];
}

#pragma mark - Getter methods
- (CAGradientLayer *)gradientLayer {
    if (!_gradientLayer) {
        // 初始化渐变层
        _gradientLayer       = [CAGradientLayer layer];
        _gradientLayer.frame = CGRectMake(0, 0, 260, 450);

        // 设置颜色渐变方向
        _gradientLayer.startPoint = CGPointMake(0, 0);
        _gradientLayer.endPoint   = CGPointMake(0, 1);

        // 设定颜色组
        _gradientLayer.colors = @[(__bridge id)[UIColor clearColor].CGColor,
                                  (__bridge id)[UIColor blueColor].CGColor];

        // 设定颜色分割点
        _gradientLayer.locations = @[@(0.5f), @(1.f)];
    }
    return _gradientLayer;
}

@end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值