CGLayer是一种很好的缓存常绘内容的方法。注意,不要与CALayer混淆。CALayer是Core Animation中更加强大、复杂的图层对象,而CGLayer是Core Graphics中优化的图层,通常是通过硬件优化用于在CGContext中绘制的。

CGContext有很多种。最常见的是视图图形上下文,由UIGraphicsCurrentContext方法生成,主要用来在屏幕上绘图。上下文也可以在位图和打印中使用。它们拥有不同的特性,包括最大分辨率、颜色详细信息以及是否可以硬件加速。

简单地说,CGLayer与CGBitmapContext类似。你可以在其中绘制内容,保存它并在以后将其结果绘入CGContext中。不同的地方在于,你可以针对特定类型的图形上下文来优化CGLayer。如果某个CGLayer是用于视图图形上下文的,它便可以直接在GPU上缓存其数据,这样可以大大提高性能。CGBitmapContext做不到这点,因为它不知晓你打算在屏幕上绘制它。

下面的示例演示了如何缓存CGLayer。在这个示例中,它在视图被第一次绘制时缓存到一个静态变量。然后,可以在旋转上下文的同时重复“印上”CGLayer图层。使用了UIGraphicsPushContext,这样就可以使用UIKit在图层上下文中绘制文本,而UIGraphicsPopContext则用来返回到普通上下文。这也可以用CGContextShowTextAtPoint完成,UIKit非常易于绘制某个NSString。输出如图8-14所示。

LayerView.m(Layer)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

- (void)drawRect:(CGRect)rect {

static CGLayerRef sTextLayer = NULL;

CGContextRef ctx = UIGraphicsGetCurrentContext();

if (sTextLayer == NULL) {

CGRect textBounds = CGRectMake(0, 0, 200, 100);

sTextLayer = CGLayerCreateWithContext(ctx,

textBounds.size,

NULL);

CGContextRef textCtx = CGLayerGetContext(sTextLayer);

CGContextSetRGBFillColor (textCtx, 1.0, 0.0, 0.0, 1);

UIGraphicsPushContext(textCtx);

UIFont *font = [UIFont systemFontOfSize:13.0];

[@"Pushing The Limits" drawInRect:textBounds

withFont:font];

UIGraphicsPopContext();

}

CGContextTranslateCTM(ctx, self.bounds.size.width
/ 2,

self.bounds.size.height
/ 2);

for (NSUInteger i = 0; i
< 10; ++i) {

CGContextRotateCTM(ctx, 2 * M_PI
/ 10);

CGContextDrawLayerAtPoint(ctx,

CGPointZero,

sTextLayer);

}

}

CGLayer和CALayer区别的更多相关文章

  1. UIView 和 CALayer区别 为啥有UIView还要CALayer?

    今天,被坑了,面试的时候没回答出来,特此记录一下 一.继承结构 1: UIView的继承结构为: UIResponder : NSObject UIResponder是用来响应事件的,也就是UIVie ...

  2. UIView与CALayer 区别

    在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个 ...

  3. UIView和CALayer区别

    (1)首先UIView可以响应用户的触摸事件,Layer不可以. (2)View中frame getter方法,bounds和center,UIView并没有做什么工作:它只是简单的各自调用它底层的C ...

  4. UIView CALayer 的区别

    UIView与CALayer的区别,很详细 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不 ...

  5. 详解CALayer 和 UIView的区别和联系

    详解CALayer 和 UIView的区别和联系   前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 CALayer 的区别和联系的时候,被喵神指出没有切中要点,所以这里就 CALay ...

  6. iOS 杂笔-20(UIView和CALayer的区别与联系)

    iOS 杂笔-20(UIView和CALayer的区别与联系) 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提 ...

  7. UIView与CALayer的区别,很详细

    研 究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人, ...

  8. POP动画引擎中Layer与CALayer的一点区别

    POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...

  9. iOS 之 CALayer与UIView的区别

    最大区别:CALayer (图层)不会直接渲染到屏幕上. UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它.它本身完全是由CoreAnimation来实现的. 真正的绘图部分,是由一 ...

随机推荐

  1. text-html 转译

    var HtmlUtil = { 2 /*1.用浏览器内部转换器实现html编码(转义)*/ 3 htmlEncode:function (html){ 4 //1.首先动态创建一个容器标签元素,如D ...

  2. csp-s模拟测试60

    csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...

  3. 一次性安装python常用模块

    链接:https://pan.baidu.com/s/1fuIxRUnkJJfzgrbQ8kIgvw 提取码:d1r6 电脑必须是win64才可以安装 Anaconda3安装完成后,不需要自己添加环境 ...

  4. Requests+Excel接口自动化测试(Python)

    一.框架结构:  工程目录 二.Case文件设计 三.基础包 base 3.1 封装get/post请求(runmethon.py) import requests import json class ...

  5. ABP Linq 扩展的 WhereIf 查询内部实现

    public static class QueryableExtensions { public static IQueryable<T> WhereIf<T>(this IQ ...

  6. JSONObjectSample

    package com.egeniuss.platform.basic; import java.util.ArrayList; import java.util.HashMap; import ja ...

  7. SpringMVC的Hello World

    本次使用Maven和Spring IO platform创建SpringMVC的Hello World. 一.Maven的Pom文件内容如下: <project xmlns="http ...

  8. UBOOT的的 C 语言代码部分

    调用一系列的初始化函数 1. 指定初始函数表: init_fnc_t *init_sequence[] = { cpu_init,           /* cpu 的基本设置         */ ...

  9. 04.Mybatis输出映射之ResultMap

    当实体类中的字段名与数据库中的字段名不一致时需要手动设置映射关系 在Mapper.xml中定义 <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo ...

  10. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列

    题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题 ...