看支付宝蚂蚁积分,天气预报等好多APP都有圆形渐变效果,今天就试着玩了。

一.CAGradientLayer类中属性介绍

CAGradientLayer继承CALayer,主要有以下几个属性:

1.@property(nullable, copy) NSArray *colors; 渐变的颜色 这个数组中只设置一个颜色是不显示的

2.@property(nullable, copy) NSArray<NSNumber *> *locations;每种颜色的最亮的位置

3.@property CGPoint startPoint;  @property CGPoint endPoint; 渐变的方向 左上(0,0)  右下(1,1) startPoint——>endPoint

4.@property(copy) NSString *type; 目前只有一种kCAGradientLayerAxial

通过设置上面的属性来看下效果

  

  1. #import "ViewController.h"
  2.  
  3. @interface ViewController ()
  4.  
  5. @end
  6.  
  7. @implementation ViewController
  8.  
  9. - (void)viewDidLoad {
  10. [super viewDidLoad];
  11.  
  12. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  13.  
  14. gradientLayer.frame = CGRectMake(, , , );
  15.  
  16. //设置颜色
  17. [gradientLayer setColors:[NSArray arrayWithObjects:(id)[[UIColor greenColor] CGColor],(id)[[UIColor redColor] CGColor],(id)[[UIColor yellowColor] CGColor],(id)[[UIColor blueColor] CGColor],(id)[[UIColor redColor] CGColor], nil]];
  18.  
  19. //每种颜色最亮的位置
  20. [gradientLayer setLocations:@[@,@]];
  21. //渐变的方向StartPoint->EndPoint
  22. [gradientLayer setStartPoint:CGPointMake(, )];
  23. [gradientLayer setEndPoint:CGPointMake(, )];
  24.  
  25. [self.view.layer addSublayer:gradientLayer];
  26. }
  27.  
  28. - (void)didReceiveMemoryWarning {
  29. [super didReceiveMemoryWarning];
  30. // Dispose of any resources that can be recreated.
  31. }
  32.  
  33. @end

二 .使用CAGradientLayer+UIBezierPath实现圆形渐变

1.自定义GredientLayerView

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface GredientLayerView : UIView
  4.  
  5. @end
  1. //
  2. // GredientLayerView.m
  3. // GredientLayerView
  4. //
  5. // Created by City--Online on 15/10/26.
  6. // Copyright © 2015年 City--Online. All rights reserved.
  7. //
  8.  
  9. #import "GredientLayerView.h"
  10.  
  11. #define degreesToRadians(x) (M_PI*(x)/180.0) //把角度转换成PI的方式
  12.  
  13. static const float kPROGRESS_LINE_WIDTH=4.0;
  14.  
  15. @interface GredientLayerView ()
  16.  
  17. @property (nonatomic,strong) CAShapeLayer *progressLayer;
  18.  
  19. @end
  20. @implementation GredientLayerView
  21.  
  22. - (instancetype)initWithFrame:(CGRect)frame
  23. {
  24. self = [super initWithFrame:frame];
  25. if (self) {
  26.  
  27. //设置贝塞尔曲线
  28. UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/, self.bounds.size.height/) radius:(frame.size.width-kPROGRESS_LINE_WIDTH)/ startAngle:degreesToRadians(-) endAngle:degreesToRadians() clockwise:YES];
  29.  
  30. //遮罩层
  31. _progressLayer = [CAShapeLayer layer];
  32. _progressLayer.frame = self.bounds;
  33. _progressLayer.fillColor = [[UIColor clearColor] CGColor];
  34. _progressLayer.strokeColor=[UIColor redColor].CGColor;
  35. _progressLayer.lineCap = kCALineCapRound;
  36. _progressLayer.lineWidth = kPROGRESS_LINE_WIDTH;
  37.  
  38. //渐变图层
  39. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  40. gradientLayer.frame = _progressLayer.frame;
  41. [gradientLayer setColors:[NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor],(id)[[UIColor yellowColor] CGColor],(id)[[UIColor blueColor] CGColor], nil]];
  42. [gradientLayer setLocations:@[@,@]];
  43. [gradientLayer setStartPoint:CGPointMake(, )];
  44. [gradientLayer setEndPoint:CGPointMake(, )];
  45.  
  46. //用progressLayer来截取渐变层 遮罩
  47. [gradientLayer setMask:_progressLayer];
  48. [self.layer addSublayer:gradientLayer];
  49.  
  50. //增加动画
  51. CABasicAnimation *pathAnimation=[CABasicAnimation animationWithKeyPath:@"strokeEnd"];
  52. pathAnimation.duration = ;
  53. pathAnimation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  54. pathAnimation.fromValue=[NSNumber numberWithFloat:0.0f];
  55. pathAnimation.toValue=[NSNumber numberWithFloat:1.0f];
  56. pathAnimation.autoreverses=NO;
  57. _progressLayer.path=path.CGPath;
  58. [_progressLayer addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
  59. }
  60. return self;
  61. }
  62.  
  63. @end

2.调用

  1. //
  2. // ViewController.m
  3. // Gredientlayer
  4. //
  5. // Created by City--Online on 15/10/26.
  6. // Copyright © 2015年 City--Online. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import "GredientLayerView.h"
  11. @interface ViewController ()
  12.  
  13. @end
  14.  
  15. @implementation ViewController
  16.  
  17. - (void)viewDidLoad {
  18. [super viewDidLoad];
  19. GredientLayerView *gredientLayerView=[[GredientLayerView alloc]initWithFrame:CGRectMake(, , , )];
  20. [self.view addSubview:gredientLayerView];
  21.  
  22. }
  23.  
  24. - (void)didReceiveMemoryWarning {
  25. [super didReceiveMemoryWarning];
  26. // Dispose of any resources that can be recreated.
  27. }
  28.  
  29. @end

3.效果

关于遮罩层的定义请参考百度百科:http://baike.baidu.com/view/1140860.htm

遮罩层必须至少有两个图层,上面的一个图层为“遮罩层”,下面的称“被遮罩层”;这两个图层中只有相重叠的地方才会被显示。也就是说在遮罩层中有对象的地方就是“透明”的,可以看到被遮罩层中的对象,而没有对象的地方就是不透明的,被遮罩层中相应位置的对象是看不见的。

它的原理是:上面一层是遮罩层,下面一层是被遮罩层。遮罩层上的图,自己是不显示的。它只起到一个透光的作用。假定遮罩层上是一个正圆,那么光线就会透过这个圆形,射到下面的被遮罩层上,只会显示一个圆形的图形。如果遮罩层上什么都没有,那么光线就无法透到下面来,那么下面的被遮罩层什么也显示不出来。

之前一直疑惑当设置遮罩后,遮罩层并不显示自身的样式,例如我设置了遮罩层的strokeColor为红色时,显示的是被遮罩层,当设置为透明时被遮罩层也不显示了,具体透明是什么样的一个原理,暂且还没弄明白,这里根据上面的遮罩层的原理就认为设置透明则就是上面的什么都没有

IOS渐变图层CAGradientLayer的更多相关文章

  1. IOS 创建渐变图层

    代码如下 typedef enum { GradientLayerKindLeftRight = , GradientLayerKindUpDown, GradientLayerKindLBRT,// ...

  2. 给某个view增加颜色渐变图层

    //给某个view增加颜色透明度渐变图层 - (void) insertTransparentGradient { NSLog(@"%@",NSStringFromCGRect(s ...

  3. cocos2dx中的背景图层CCLayerColor和渐变图层CCLayerGradient

    1.CCLayerColor是专门用来处理背景颜色的图层,它继承自CCLayer,可以用来设置图层的背景颜色,因为CCLayer默认是透明色的,即无颜色的 2.CCLayerGradient是用来显示 ...

  4. iOS 渐变进度条

    #import <UIKit/UIKit.h> @interface JianBianView : UIView //为了增加一个表示进度条的进行,可们可以使用mask属性来屏蔽一部分 @ ...

  5. iOS开发——图层OC篇&Quartz 2D各种绘制实例

    Quartz 2D各种绘制实例 首先说一下,本篇文章只是介绍怎么使用Quartz 2D绘制一些常用的图像效果,关于Quartz和其他相关技术请查看笔者之前写的完整版(Quartz 2D详解) 一:画线 ...

  6. iOS开发——图层OC篇&UIColor深入研究(CGColor,CIColor)

    UIColor深入研究(CGColor,CIColor) 由于跟人比较喜欢研究关于图层与动画方面的技术,正打算看看别人写的好东西,就遇到了好几个问题, 第一:UIClor类方法的使用 就是关于UICo ...

  7. iOS渐变视图&动画库、腰杆、音频水滴水波手势、多种对话框、四级展开效果等源码

    iOS精选源码 用户行为追踪--无侵入埋点 .终端日志的打印 支持storyboard的渐变视图&动画库 支持圆形.竖直.横向的摇杆 纯swift实现的类似excel表格效果 swift实现自 ...

  8. 【iOS开发-图层】自己定义图层的两种方式

    想要自己定义图层,仅仅须要构建一个类继承CALayer方法 假设让自己定义图层初始化上面就有画好的图形.有两种办法 重写drawInContext方法 自己定义的图层以下的方法.然后必须自己定义的图层 ...

  9. iOS 渐变提示。错误弹出提示 几秒自动消失

    //事例 CGRect alertFarm = CGRectMake(,,,); [self noticeAlert:_bgView withNoticeStr:@"登录成功" w ...

随机推荐

  1. .NET Core调用WCF的最佳实践

    现在.NET Core貌似很火,与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样.但是冷静背后我们要也看到.NET Core目前还有太多不足,别的不多说,与自家的服务框架WCF ...

  2. NETCore调用AD域验证

    一.添加引用 System.DirectoryServices System.DirectoryServices.AccountManagement 二.验证代码 声明域 string domainN ...

  3. delphi 在字符串中输出单引号'

    在程序代码里,用单引号 引起来的两个单引号,经过编译后是一个单引号.'''ok''':编译后表示'ok';

  4. Verify the Developer App certificate for your account is trusted on your device.

    1.报错内容 Could not launch "CH5203" Verify the Developer App certificate for your account is ...

  5. Python内置函数查询表——总结篇

    Python3.5版本中的68个内置函数,按顺序逐个进行了自认为详细的解析,现在是时候进行个总结了.为了方便记忆,将这些内置函数进行了如下分类:     数学运算(7个)     类型转换(24个) ...

  6. day 09 课后作业

    # -*- coding: utf-8 -*-# @Time : 2018/12/28 14:25# @Author : Endless-cloud# @Site : # @File : 08 课后作 ...

  7. webpack+vue中安装使用vue-layer弹窗插件

    1.安装vue-layer插件 npm install vue-layer --save-dev 2.打包入口文件main.js中引入vue.vue-layer.并且将vue-layer添加到vue原 ...

  8. iOS11 & iPhone X 适配指南

    苹果WWDC开发者大会上,终于发布了大家期待已久的iOS 11,有些新特性功能确实出人意料.不过大的方面苹果貌似也就 AR 和 GM 机器学习了,9月13日凌晨1点,苹果开了新品发布会,相信大家都已经 ...

  9. QuantLib 金融计算——基本组件之 Schedule 类

    目录 QuantLib 金融计算--基本组件之 Schedule 类 Schedule 对象的构造 作为"容器"的 Schedule 对象 一些常用的成员函数 如果未做特别说明,文 ...

  10. Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云!

    Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云! Chef.Puppet.Ansible.SaltStack 都可以称为配置管理工具,这些工具的主要目 ...