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.mLayer

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. (转)I帧,P帧,B帧 .

    转:http://blog.csdn.net/abcjennifer/article/details/6577934 视频压缩中,每帧代表一幅静止的图像.而在实际压缩时,会采取各种算法减少数据的容量, ...

  2. arcmap分类标注问题

    在给图层标注的时候,经常出现冲突后有些标注出不来,需要将某些个别的点要素进行标注位置调整,如下图: 处理步骤如下, (1)打开Maplex标注引擎.从ToolBars中打开Labeling工具,勾选U ...

  3. Error parsing XML: junk after document element这样的错误 - CSDN博客

    很多开发者可能在编写XML布局文件时提示Error parsing XML: junk after document element这样的错误,这里Android123提示大家一般合法的XML文件只有 ...

  4. element table初始化默认选中以及切换页码的时候保留选中状态

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- impor ...

  5. PAT甲级——A1128 N Queens Puzzle【20】

    The "eight queens puzzle" is the problem of placing eight chess queens on an 8 chessboard ...

  6. 初识OpenCV-Python - 003:Mouse as a paint-brush

    此次学习了如何在OpenCV中使用鼠标事件.主要使用cv2.setMouseCallback()函数来调用鼠标事件. 首先,鼠标有如下事件: >>> import cv2>&g ...

  7. POJ 2074 /// 判断直线与线段相交 视野盲区

    题目大意: 将所有物体抽象成一段横向的线段 给定房子的位置和人行道的位置 接下来给定n个障碍物的位置 位置信息为(x1,x2,y) 即x1-x2的线段 y相同因为是横向的 求最长的能看到整个房子的一段 ...

  8. jquery.artDialog.source.js学习

    1 关键的对象关系art = jQuery = $function artDialog() {...}artDialog.fn = artDialog.prototype = artDialog.fn ...

  9. HNOI2018思记

    4-13 顺顺利利到了湖南.晚上认真研读cf毒瘤题题解,未果. 发现这里含铁丰富的高温多雨式红土地.以及窗户特别深,总有一圈小阳台的房子,门楣深邃如瞳. 看了一波miaom的ZJOI游记,思考了一下解 ...

  10. 查看java资源的占用

    1,使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如1232,按H,获取每个线程的内存情况3,找到内存和cpu占用最高的线程pid,比如 ...