CAGradientLayer

 

CAGradientLayer is used to generate a smooth gradient between two or more colors. 是用来产生渐变色的。

It's possible to replicate the appearance of a CAGradientLayer using Core Graphics to draw into an ordinary layer's backing image, but the advantage of using a CAGradientLayer instead is that the drawing is hardware accelerated.

好处是硬件加速的。

Basic Gradients

 

We'll start with a simple diagonal gradient from red to blue (see Listing 6.6). The gradient colors are specified using the colors property, which is an array. The colors array expects values of type CGColorRef (which is not an NSObject derivative), so we need to use the bridging trick that we first saw in Chapter 2 to keep the compiler happy.

gradients colors 是一个数组,要用到CGColorRef 。

 

CAGradientLayer also has startPoint and endPoint properties that define the direction of the gradient. These are specified in unit coordinates, not points, so the top-left corner of the layer is specified with {0, 0} and the bottom-right corner is {1, 1}. The resulting gradient is shown in Figure 6.6.

unit coordinates,不是points,top left corner of the layer 是{0,0},而右下角是{1,1}

 

Listing 6.6 A Simple Two-Color Diagonal Gradient

@interface ViewController ()

 

@property (nonatomic, weak) IBOutlet UIView *containerView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//create gradient layer and add it to our container view

 

CAGradientLayer *gradientLayer = [CAGradientLayer layer];

gradientLayer.frame = self.containerView.bounds;

[self.containerView.layer addSublayer:gradientLayer];

//set gradient colors

gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id)[UIColor blueColor].CGColor];

//set gradient start and end points

gradientLayer.startPoint = CGPointMake(0, 0); gradientLayer.endPoint = CGPointMake(1, 1);

}

@end

 

Multipart Gradients 多部分组成的Gradients

The colors array can contain as many colors as you like, so it is simple to create a multipart gradient such as a rainbow. By default, the colors in the gradient will be evenly spaced, but we can adjust the spacing using the locations property.

 

The locations property is an array of floating-point values (boxed as NSNumber objects). These values define the positions for each distinct color in the colors array, and are specified in unit coordinates, with 0.0 representing the start of the gradient and 1.0 representing the end.

locations 属性也是一个array .这些值定义了位置,为每个颜色,并指明在unit coordinates .

 

It is not obligatory to supply a locations array, but if you do, you must ensure that the number of locations matches the number of colors or you'll get a blank gradient.

指定locations 不是强制的,但是如果你做了,你需要确保locations 的数量和colors数量相同。否则,可能会获取一个空白的gradient

Listing 6.7 shows a modified version of the diagonal gradient code from Listing 6.6. We now have a three-part gradient from red to yellow to green. A locations array has been specified with the values 0.0, 0.25, and 0.5, which causes the gradient to be squashed up toward the top-left corner of the view (see Figure 6.7).

 

Listing 6.7 Using the locations Array to Offset a Gradient

- (void)viewDidLoad {

[super viewDidLoad];

//create gradient layer and add it to our container view

 

CAGradientLayer *gradientLayer = [CAGradientLayer layer];

gradientLayer.frame = self.containerView.bounds;

[self.containerView.layer addSublayer:gradientLayer];

//set gradient colors

gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id)[UIColor yellowColor].CGColor, (__bridge id)[UIColor greenColor].CGColor];

//set locations

gradientLayer.locations = @[@0.0, @0.25, @0.5];

//set gradient start and end points

gradientLayer.startPoint = CGPointMake(0, 0);

 

gradientLayer.endPoint = CGPointMake(1, 1);

}

 

Figure 6.7 A three-color gradient, offset to the top left using the locations array

CAReplicatorLayer

 

The CAReplicatorLayer class is designed to efficiently generate collections of similar layers.

是为了产生相似layers的容器的。

It works by drawing one or more duplicate copies of each of its sublayers, applying a different transform to each duplicate. This is probably easier to demonstrate than to explain, so let's construct an example.

Repeating Layers

 

In Listing 6.8, we create a small white square layer in the middle of the screen, then turn it into a ring of ten layers using CAReplicatorLayer. The instanceCount property specifies how many times the layer should be repeated.

instanceCount 属性指明了这个layer需要复制多少次 

The instanceTransform applies a CATransform3D (in this case, a translation and rotation that moves the layer to the next point in the circle).

The transform is applied incrementally, with each instance positioned relative to the previous one. This is why the duplicates don't all end up in the same place. Figure 6.8 shows the result.

 

Listing 6.8 Repeating Layers Using CAReplicatorLayer

@interface ViewController ()

@property (nonatomic,weak)IBOutlet UIView *containerView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//create a replicator layer and add it to our view

 

CAReplicatorLayer *replicator = [CAReplicatorLayer layer];

replicator.frame = self.containerView.bounds;

[self.containerView.layer addSublayer:replicator];

//configure the replicator

replicator.instanceCount = 10;

//apply a transform for each instance

 

CATransform3D transform = CATransform3DIdentity;

transform = CATransform3DTranslate(transform, 0, 200, 0);

transform = CATransform3DRotate(transform, M_PI / 5.0, 0, 0, 1);

transform = CATransform3DTranslate(transform, 0, -200, 0);

 

replicator.instanceTransform = transform;

//apply a color shift for each instance

 

replicator.instanceBlueOffset = -0.1;

replicator.instanceGreenOffset = -0.1;

//create a sublayer and place it inside the replicator

 

CALayer *layer = [CALayer layer];

layer.frame = CGRectMake(100.0f, 100.0f, 100.0f, 100.0f);

layer.backgroundColor = [UIColor whiteColor].CGColor;

[replicator addSublayer:layer];

}

 

@end

6 Specialzed layers 特殊层 第二部分 读书笔记的更多相关文章

  1. 6 Specialzed layers 特殊层 第一部分 读书笔记

    6 Specialzed layers 特殊层  第一部分  读书笔记   Specialization is a feature of every complex organization. 专注是 ...

  2. linux第二次读书笔记

    <Linux内核设计与实现>读书笔记 第五章 系统调用   第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用 ...

  3. 《ECMAScript标准入门》第二版读书笔记

    title: <ECMAScript标准入门>第二版 date: 2017-04-10 tags: JavaScript categories: Reading-note 2015年6月, ...

  4. 《细说PHP》第二版--读书笔记

    第五章 PHP的基本语法 5.2.4 在程序中使用空白的处理 5.3 变量 5.3.1 变量的声明 在php中变量的声明必须是使用一个$符号,后面跟变量名来表示 unset()函数释放指定变量 iss ...

  5. 20135320赵瀚青LINUX第二章读书笔记

    第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...

  6. Android深度探索--HAL与驱动开发----第二章读书笔记

    1. 底层开发工具包括: JDk6或者以上版本:Eclipse3.4或以上版本:ADT(用于开发Android应用程序),CDT(用于开发AndroidNDK程序):Android SDK:Andro ...

  7. sed&awk第二版读书笔记

    1. POSIX标准对正则表达式字符和操作符的含义进行了形式化.这种标准定义了两类正则表达式:基本的正则表达式(BRE),grep和sed使用这种正则表达式;扩展的表达式,egrep和awk使用这种正 ...

  8. Linux第二章读书笔记

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

  9. 2013337朱荟潼 Linux第二章读书笔记——从内核出发

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

随机推荐

  1. CSS自定义文件上传按钮样式,兼容主流浏览器

    解决办法:使用text文本框及a链接模拟文件上传按钮,并且把文件上传按钮放在他们上面,并且文件上传按钮显示透明.​1.图片​​2. [代码][HTML]代码 <div class="b ...

  2. WebStorm配置SVN

    下载SVN客户端管理工具TortoiseSVN-1.8.5.25224-x64-svn-1.8.8,选择合适的Windows版本 配置项目目录,对应的VCS为Subversion 设置Subversi ...

  3. Linux系统CentOS下mysql的安装日志

    今天自己捣鼓了一下,在linux系统CentOs6.5下使用源码方式安装和配置mysql,这里记录一下步骤. a) 下载mysql,source版本.Mysql-5.6.20.tar.gz b) 安装 ...

  4. 书写优雅的shell脚本(插曲)- /proc/${pid}/status

    Linux中/proc/[pid]/status详细说明 博客分类: OS Linux多线程  [root@localhost ~]# cat /proc/self/status  Name: cat ...

  5. 理解Objective-C Runtime(三)消息转发机制

    消息转发机制概述 上一篇博客消息传递机制中讲解了Objective-C中对象的「消息传递机制」.本文需要讲解另外一个重要问题:当对象受到无法处理的消息之后会发生什么情况? 显然,若想令类能理解某条消息 ...

  6. 哈希表的C实现(一)

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

  7. linux中vim常用命令总结

  8. Android HandlerThread源码解析

    在上一章Handler源码解析文章中,我们知道App的主线程通过Handler机制完成了一个线程的消息循环.那么我们自己也可以新建一个线程,在线程里面创建一个Looper,完成消息循环,可以做一些定时 ...

  9. Android Fragment使用小结及介绍

    目录(?)[-] 一什么是Fragment 二Fragment的生命周期 三Fragment的两种添加方式addreplace 四两种添加方式性能比较 偶记得第一次接触Fragment,觉得好牛叉的组 ...

  10. spoj NSUBSTR - Substrings【SAM】

    先求个SAM,然后再每个后缀的对应点上标记si[nw]=1,造好SAM之后用吧parent树建出来把si传上去,然后用si[u]更新f[max(u)],最后用j>i的[j]更新f[i] 因为每个 ...