图形上下文栈:

应用,修改过上下文后,下一次画会在这个基础上进行,如果清空状态,需要上下文栈。

可以先把原来的上下文保存起来,然后恢复:

- (void)drawRect:(CGRect)rect {

    CGContextRef ref = UIGraphicsGetCurrentContext();

    // 保存上下文
CGContextSaveGState(ref); CGContextMoveToPoint(ref, 100, 100);
CGContextAddLineToPoint(ref, 200, 200);
[[UIColor redColor] set];
CGContextSetLineCap(ref, kCGLineCapRound);
CGContextSetLineWidth(ref, 5);
CGContextStrokePath(ref); // 恢复上下文
CGContextRestoreGState(ref); CGContextMoveToPoint(ref, 250, 200);
CGContextAddLineToPoint(ref, 100, 180);
CGContextStrokePath(ref); }

在CGContextRef中有一个专门的空间用于保存上下文的状态,在其内部也有一个区域会把要画的东西先画一遍。

CGContextSaveGState是将ctx拷贝一份,放到栈中,Restore则是出栈。

Tip:CorePlot已经封装好了各种函数图。

矩阵操作:

先设置状态,再画才有作用:注意角度转弧度的时候除以180.0。

第一个是改变缩放比例,第二个是跳转转角。

CGContextScaleCTM(ctx, x_scale, y_scale);
CGContextRotateCTM(ctx, angle / 180.0 * M_PI_2);

图片的裁剪:

先在图像后面画一个形状,然后调用裁剪方法,最后再显示图片,就可以生成裁剪后的图片:

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50));

    CGContextClip(ctx);

    CGContextFillPath(ctx);

    UIImage *image = [UIImage imageNamed:@"head"];

    [image drawInRect:CGRectMake(0, 0, 50, 50)];

注意是先画一个圆,然后在圆心处放一个与圆的外接正方形重合的图片,这样就可以实现圆型裁剪。

注意先添加图形,再执行裁剪,再显示图形,最后显示图片。

刷帧的方法:多次调用绘图函数

注意drawRect只能由系统调用,手动调用无法获得上下文。

调用view的setNeedsDisplay可以让系统调用。

Tip:如果视图没有改变,调用这个方法仍然会重绘。

Tip:在drawRect方法中调用setNeedsDisplay不会引起死循环。

Tip:从storyboard或者xib初始化完成后会调用awakeFromNib,可以在这里做一些初始化的效果,例如定时器。

Tip:1s以上的使用NSTimer,对于高速刷帧,应该使用CADisplayLink方法。

[CADisplayLink displayLinkWithTarget: ... selector: ... ],用link指针指向它。

添加到消息循环的方法:[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSdefaultRunLoop];

上下文显示到iOS手机屏幕,是通过Layer方式显示的。

Window指的是显示在Mac电脑屏幕上。

通过UIKit也可以调用Quarz2D:不需要主动传上下文。

UIRectFill方法可以画矩形,并且不需要传上下文。

通过创建路径的方式来绘图(涉及到内存管理):

实际上,直接使用ctx也是自动创建一个path,下面的过程通过path来绘图:即使是ARC,也需要使用release。

    CGContextRef ctx = UIGraphicsGetCurrentContext();
// 1.创建路径
CGMutablePathRef path = CGPathCreateMutable();
// 2.拼接路径
CGPathMoveToPoint(path, NULL, 0, 0);
CGPathAddLineToPoint(path, NULL, 100, 100);
// 3.添加路径
CGContextAddPath(ctx, path);
// 4.渲染
CGContextStrokePath(ctx);
// 5.释放path
CGPathRelease(path);

注意ColorSpace也是需要释放的。都有相应的Release函数(C语言方式)。

有一个统一的方法,CFRelease,可以释放任何对象。

(四十八)Quartz2D引擎进阶的更多相关文章

  1. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  3. 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)

    1.简介 webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelec ...

  4. 第四十八个知识点:TPM的目的和使用方法

    第四十八个知识点:TPM的目的和使用方法 在检查TPM目的之前,值得去尝试理解TPM设计出来的目的是为了克服什么样的问题.真正的问题是信任.信任什么?首先内存和软件运行在电脑上.这些东西能直接的通过操 ...

  5. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十二(四十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  6. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  7. Python学习(四十二)—— Djago-model进阶

    一.QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # (LIMI ...

  8. C#编程(四十八)----------列表

    C#中的List C#中deList怎么样?List<T>类是ArrayList类的泛型等效类,该类使用大小可按需动态增长的数组实现List<T>泛型接口. 泛型的好处:它为使 ...

  9. Jmeter(四十八)_动态线程分析HTML测试报告

    概述 jmeterGUI模式下,性能测试的结果往往误差很大,因为GUI本身就会消耗一部分资源.所以我们常常用命令行去跑性能脚本,得出结果 同时,jmeter在命令行下还可以生成多维度的测试报告,里面包 ...

随机推荐

  1. python常用执行方式&变量&input函数

    linux系统中执行py文件方式:  ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...

  2. Node.js HTTPS

    稳定性: 3 - 稳定 HTTPS 是基于 TLS/SSL 的 HTTP 协议.在 Node 里作为单独的模块来实现. 类: https.Server 这是 tls.Server 的子类,并且和 ht ...

  3. About Windows 10 April 2018 Update

    在四月的最后一天,微软终于正式发布了 Windows 10 的又一次重大更新,并命名为 Windows 10 四月更新,轮压哨,我软确实谁也不服:再晚一天,我软改名部门恐怕又要发挥作用了,毕竟我软存在 ...

  4. Dubbo框架应用之(二)--服务治理

    Dubbo服务治理全貌图 当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前,我们可以采用的是RMI或Hessian等工具,暴露和引用远程服务, ...

  5. 手动创建第一个OC程序

    手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...

  6. 给现有的word和pdf加水印

    iTextSharp简单生成pdf和操作pdf添加水印 给word加水印,利用的是aspose.words

  7. Android studio - Failed to find target android-18

    看了一下国外的解决方案,好多人也都遇到此类问题.看老外的聊天,由衷觉得着实的可爱,同时外国的月亮也不见得比国内的圆.以下是他们的对话(最后有一个小总结):   I have a problem wit ...

  8. ThinkPHP 初探

    准备 ThinkPHP下载 Eclipse-for-php 如何使用 放置位置 检验引用效果 效果 路由 调试之模板的使用 前提 生产模式 开发模式 添加完相应的路径以及模板文件后 总结 对国人开发的 ...

  9. 64位Linux下安装mysql-5.7.13-linux-glibc2.5-x86_64 || 转载:http://www.cnblogs.com/gaojupeng/p/5727069.html

    由于公司临时让将Oracle的数据移植到mysql上面,所以让我在公司服务器上面安装一下mysql.下面就是我的安装过程以及一些错误解决思路.其实对于不同版本安装大体都有差不多. 1. 从官网下载 m ...

  10. Java安全管理器——SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...