iOS之UI--CAGradientLayer

简介:

1、CAGradientLayer 简介

如果说CAShapeLayer是用于提供设置形状的,那么CAGradientLayer是用于提供设置颜色的

英语单词:Gradient:梯度,渐变

那么Gradient Layer就是渐变层的意思了。

  • CAGradientLayer简介

    • CAGradientLayer是用于处理渐变色的层结构
    • CAGradientLayer的渐变色可以做隐式动画
    • 大部分情况下,CAGradientLayer都是与CAShapeLayer配合使用的
    • CAGradientLayer可以用作png遮罩效果
  • 使用CAGradientLayer主要的方法

    • locations 设置颜色分割点的数组
    • startPoint 坐标系统的起点
    • endPoint 坐标系统的终止点
      • startPoint和endPoint的起止点范围(0,0)~(1,1)
    • colors 颜色值数组,颜色个数 >=2 才有用

      最后给出YouXianMing老师的四个关于CAGradientLayer的Example Code下载链接: http://pan.baidu.com/s/1eR0Q7Hw 密码: 7zvm

      2、CAGradientLayer 坐标系统

    • CAGradientLayer的坐标系统是从坐标(0,0)到(1,1)绘制的矩形
    • CAGradientLayer的frame值的size不为正方形的话,坐标系统会被拉伸
    • CAGradientLayer的startPoint与endPoint会直接影响颜色的绘制方向
    • CAGradientLayer的颜色分割点割点是以0到1的比例来计算的
    • 个人分析:
      • 当"颜色的个数 = 设置颜色分割点的个数 + 1",是最大有效渐变颜色设置的数量关系
      • 当"颜色的个数 > 设置颜色分割点的个数 + 1",会出现多余的颜色不显示在屏幕上
      • 当"颜色的个数 < 设置颜色分割点的个数 + 1",多余的分割点无用

    用于体会的源码

    #import "CAGradientLayerController.h"
    
    #define ScreenWidth [UIScreen mainScreen].bounds.size.width
    #define ScreenHeight [UIScreen mainScreen].bounds.size.height
    
    @interface CAGradientLayerController ()
    
    /** GradientLayer */
    @property (nonatomic,weak)CAGradientLayer *gradientLayer;
    @property (nonatomic,weak)CAGradientLayer *gradientLayer2;
    
    @end
    
    @implementation CAGradientLayerController
    
    - (void)viewDidLoad {
     [super viewDidLoad];
     
     // 第一个layer
     NSArray* colors = @[(__bridge id)[UIColor redColor].CGColor,
     (__bridge id)[UIColor blueColor].CGColor];
     self.gradientLayer = [self addGradientLayerWithFrame:CGRectMake(ScreenWidth * 0.5 - 100, 50, 200, 100) colors:colors locations:nil];
     
     // 第二个layer
     NSArray* colors2 = @[(__bridge id)[UIColor redColor].CGColor,
     (__bridge id)[UIColor blueColor].CGColor];
     NSArray* locations2 = @[@(0.5),@(0.75)];
     
     self.gradientLayer = [self addGradientLayerWithFrame:CGRectMake(ScreenWidth * 0.5 - 100, 170, 200, 100) colors:colors2 locations:locations2];
     
     // 第三个layer
     NSArray* colors3 = @[(__bridge id)[UIColor redColor].CGColor,
     (__bridge id)[UIColor greenColor].CGColor,
     (__bridge id)[UIColor blueColor].CGColor];
     NSArray* locations3 = @[@(0),@(0.5)];
     
     self.gradientLayer = [self addGradientLayerWithFrame:CGRectMake(ScreenWidth * 0.5 - 100, 290, 200, 100) colors:colors3 locations:locations3];
     
     // 第四个layer
     NSArray* colors4 = @[(__bridge id)[UIColor blackColor].CGColor,//黑色
     (__bridge id)[UIColor whiteColor].CGColor,//白色
     (__bridge id)[UIColor greenColor].CGColor,//绿色
     (__bridge id)[UIColor blueColor].CGColor, //蓝色
     (__bridge id)[UIColor grayColor].CGColor, //灰色
     (__bridge id)[UIColor brownColor].CGColor //棕色
     ];
     NSArray* locations4 = @[@(0.25),@(0.5),@(0.75),@(0.85)];
     /*
     * 0~0.25 黑色◎
     * 0.25~0.5 黑色↓ 白色↑
     * 0.5~0.75 白色↓ 绿色↑
     * 0.75~0.85 绿色↓ 蓝色↑
     * 0.85~1.0 蓝色↓ 灰色↑
     * 因为到1.0就结束了,所以棕色就是多余的了
     */
     
     self.gradientLayer = [self addGradientLayerWithFrame:CGRectMake( 2, 410, ScreenWidth - 4, 100) colors:colors4 locations:locations4];
     
    
    }
    -(CAGradientLayer*)addGradientLayerWithFrame:(CGRect)frame colors:(NSArray<NSNumber*>*)colors locations:(NSArray<NSNumber*>*)locations {
     CAGradientLayer* gradientLayer = [CAGradientLayer layer];
     gradientLayer.frame = frame;
     gradientLayer.colors = colors;
     gradientLayer.locations = locations;
     gradientLayer.borderWidth = 1.0f;
     
     gradientLayer.startPoint = CGPointMake(0, 0);
     gradientLayer.endPoint = CGPointMake(1, 0);
     
     [self.view.layer addSublayer:gradientLayer];
     return gradientLayer;
    }
    
    @end

    3、色差动画的实现

  • 确定渐变色渐变方向
  • 设定两种颜色,其中一种是透明色,另外一种是自定义颜色
  • 设定好location颜色分割点值
  • CAGradientLayer的颜色分割点是以0到1的比例来计算的

  • 补充:

    • arc4random()是随机生成任意数值,所以arc4random() % 99这个求余的式子表示求出0~99之间的余数,所以通过这种类似的求余式子来设置产生)0~99之间的随机数。
    • 如果要设置0~1之间的按照自定义的精细度设置范围:
      • 比如我需要将0~1拆分为255份,那么就要arc4random() % 255 / 255.0f
      • 比如我需要将0~1拆分为10份, 那么就要arc4random() % 10 / 10.0f
  • 注意:

    • 如果后面 / 10.0f没有 .0f 而是直接 / 10的话,会出问题的。
      #import "CAGradientLayerController.h"
      
      #define ScreenWidth [UIScreen mainScreen].bounds.size.width
      #define ScreenHeight [UIScreen mainScreen].bounds.size.height
      
      @interface CAGradientLayerController ()
      
      /** GradientLayer */
      @property (nonatomic,weak)CAGradientLayer *gradientLayer;
      /** Timer */
      @property (nonatomic,strong)NSTimer *timer;
      
      @end
      
      @implementation CAGradientLayerController
      
      - (void)viewDidLoad {
       [super viewDidLoad];
       // 添加背景
       UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg"]];
       imageView.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);
       [self.view addSubview:imageView];
       
       // 添加色差层
       NSArray* colors = @[(__bridge id)[UIColor clearColor].CGColor,
       (__bridge id)[UIColor clearColor].CGColor];
       NSArray* locations = @[@(0)];
       
       self.gradientLayer = [self addGradientLayerWithFrame:imageView.frame colors:colors locations:locations];
       
       self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
       target:self
       selector:@selector(changeGradientColor)
       userInfo:nil
       repeats:YES];
      }
      -(void)changeGradientColor{
       self.gradientLayer.colors = @[(__bridge id)[UIColor clearColor].CGColor,
       (__bridge id)[UIColor colorWithRed:arc4random() % 255 / 255.0f
       green:arc4random() % 255 / 255.0f
       blue:arc4random() % 255 / 255.0f
       alpha:1].CGColor];
       //self.gradientLayer.locations = @[@(arc4random() % 10 / 10.0f)];
       //这个效果不好,效果是直接铺盖上去的,但是下面一种情况,是形变也是有过程的。
       self.gradientLayer.locations = @[@(arc4random() % 10 / 10.0f),@(1.0f)];
      }
      
      -(CAGradientLayer*)addGradientLayerWithFrame:(CGRect)frame colors:(NSArray<NSNumber*>*)colors locations:(NSArray<NSNumber*>*)locations {
       CAGradientLayer* gradientLayer = [CAGradientLayer layer];
       gradientLayer.frame = frame;
       gradientLayer.colors = colors;
       gradientLayer.locations = locations;
       gradientLayer.borderWidth = 1.0f;
       
       gradientLayer.startPoint = CGPointMake(0, 0);
       gradientLayer.endPoint = CGPointMake(0, 1);
       
       [self.view.layer addSublayer:gradientLayer];
       return gradientLayer;
      }
      
      @end

      4、用 CAGradientLayer 封装带色差动画的 View

    • 确定几个属性值
    • 确定可以做动画的参数
    • 重写setter方法做动画

    • 对外的需求:

      • 属性:
        • 设置上下左右色差方向(用枚举设置该属性direction)
        • 色差颜色(color)
        • 颜色占位百分比(percent)
相关文章
|
iOS开发
iOS开发UI之日期控件的使用(UIDatePicker)
iOS开发UI之日期控件的使用(UIDatePicker)
441 0
|
3月前
|
测试技术 Swift iOS开发
探索iOS自动化测试:使用Swift编写UI测试
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是保证船只不偏离航线的灯塔。本文将带领读者启航,深入探索iOS应用的自动化UI测试。我们将通过Swift语言,点亮代码的灯塔,照亮测试的道路。文章不仅会展示如何搭建测试环境,还会提供实用的代码示例,让理论知识在实践中生根发芽。无论你是新手还是有经验的开发者,这篇文章都将是你技能提升之旅的宝贵指南。
|
机器学习/深度学习 安全 测试技术
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
阿里云EMAS测试专家有着集团内部多个日活过亿规模APP经验,提供EMAS专家测试,客户只需提交测试需求,从用例设计、脚本录制、海量机型测试、整理测试结果、48小时输出专家测试报告均由阿里云EMAS测试专家一站式服务完成。覆盖功能测试、深度兼容测试、性能测试、UI适配测试以及隐私合规检测等,帮助用户以更低成本获得高质量的全面测试能力,可用于APP正式发版前验收,规避手机APP上线前或发版过程中各类隐患。
521 0
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
|
jenkins 测试技术 macaca
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
笔者入职 Trip.com 已满一年,回顾这一年的工作历程,约一半的时间都在做 UI 自动化测试相关内容。从而,笔者更深入地研究了 iOS 平台下的自动化测试技术,目前也在负责部门 App 自动化测试平台的搭建和维护。故想借这篇文章一并将所踩过的坑以及学习到的技术,系统且全面地整理出分享给大家。
387 0
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
|
iOS开发
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
|
缓存 运维 监控
如何优化iOS系统上的图文评论UI界面
在我们的社交 APP 上,⽤户的动态由精美的照⽚ 、视频和⽂字组成。对于每张照⽚和视频, 我 们都会展示出完整的标题和五个最新评论。由于⽤户喜欢使⽤标题来讲述照⽚背后的故事, 因此它们通常很⻓ 、很复杂, 并且可能包含超链 接和表情符号。渲染如此复杂的⽂本带来了⼀些问题, 它在滚动时造成性能下降。 即使在 iPhone 12 这样的新设备上, 复杂标题的初始⽂本绘制需要⻓达 50 毫秒, ⽽⽂本展示 需要⻓达 30 毫秒, 渲染速度很慢。⽂本问题还是简单问题, 有时我们需要加载更加复杂的图⽚甚⾄视频。所有这些步骤都发⽣在 UI 线程上, 导致app在⽤户滚动时丢帧。
如何优化iOS系统上的图文评论UI界面
|
存储 数据库 开发者
iOS9系列专题五——全新的联系人与联系人UI框架(二)
iOS9系列专题五——全新的联系人与联系人UI框架
399 0
iOS9系列专题五——全新的联系人与联系人UI框架(二)
|
编解码 安全 Linux
flutter 在windows和linux上运行IOS UI模拟器
之前发视频总是有人留言,我用的什么模拟器,今天给大家说一下 我一般用的是device_preview这个插件,这个插件的闲置是只能做UI上的模拟,并没有真正的运行环境。 近似您的应用程序在另一台设备上的外观和性能。
396 0
|
iOS开发 C++
iOS子线程更新UI的两种方法
iOS子线程更新UI的两种方法
526 0
|
API iOS开发 开发者
iOS9系列专题五——全新的联系人与联系人UI框架(一)
iOS9系列专题五——全新的联系人与联系人UI框架
210 0