iOS开发Quartz2D之八:图形上下文状态栈
#import "DrawView.h"
@implementation DrawView
- (void)drawRect:(CGRect)rect {
// Drawing code
//1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路径
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(, )];
[path addLineToPoint:CGPointMake(, )];
//3.把路径添加到上下文当中.
CGContextAddPath(ctx, path.CGPath);
//保存当前上下文的状态
CGContextSaveGState(ctx);
//设置上下文的状态
CGContextSetLineWidth(ctx, );
[[UIColor redColor] set];
CGContextSaveGState(ctx);
//4.把上下文当中的内容渲染View
CGContextStrokePath(ctx);
UIBezierPath *path2 = [UIBezierPath bezierPath];
[path2 moveToPoint:CGPointMake(, )];
[path2 addLineToPoint:CGPointMake(, )];
//把路径添加到上下文当中.
CGContextAddPath(ctx, path2.CGPath);
// CGContextSetLineWidth(ctx, 1);
// [[UIColor blackColor] set];
//从上下文状态栈当中恢复上下文的状态
CGContextRestoreGState(ctx);
CGContextRestoreGState(ctx);
//把上下文当中的内容渲染View
CGContextStrokePath(ctx);
}
@end
上下文状态栈为内存中的一块区域,它用来保存前上下文当的状态.
我们获取的图层上下文当中其实两块区域,一个是存放添加的路径,一个是用来保存用户设置的状态,
这些状态包括线条的颜色,线宽等.
当我们把上下文的内容渲染到View上面的时候,
它会自动将设置的所有上下文状态运行到保存的路径上面显示到View上面.
如果想要有多种状态,可以先把路径渲染到View上面,
再从新添加路径.添加完路径之后,重新设置上下文的状态.
再把新设置的上下文状态渲染到View上面.
我们可以利用上下文状态栈的方式,在设置状态之前,把之前的状态保存到上下文状态栈里面.
下一次想要再使用之前的状态时, 可以从上下文状态当中取出之前保存的上下文状态.上下文状态栈是先进后出的
1.如何把上下文状态保存到上下文状态栈?
CGContextSaveGState(ctx);
2.如何从上下文状态栈中取出上下文状态?
CGContextRestoreGState(ctx);


iOS开发Quartz2D之八:图形上下文状态栈的更多相关文章
- iOS开发-Quartz2D初识
Quartz2D如果单独的从Quartz,那么会发现Quartz是一个开源的Java作业调度框架,单独从英文翻译的角度来看的话Quartz的英文是石英,如果有的时候不小心搜索会发现手表推荐.本文中介绍 ...
- iOS开发 - Quartz2D画图
Quartz 2D简单介绍 是一个二维画图引擎,同一时候支持iOS和Mac系统 Quartz 2D能完毕的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- 【iOS】Quartz2D基本图形
一.画线段 - (void)drawRect:(CGRect)rect { // Drawing code // 1.获得图形上下文 CGContextRef ctx = UIGraphicsGetC ...
- iOS开发CoreGraphics核心图形框架之一——CGPath的应用
一.引言 CoreGraphics核心图形框架相较于UIKit框架更加偏于底层.在Objective-C工程中,CoreGraphics其中方法都是采用C语言风格进行编写的,同时其并不支持Obj ...
- iOS开发Quartz2D之十二:手势解锁实例
一:效果如图: 二:代码: #import "ClockView.h" @interface ClockView() /** 存放的都是当前选中的按钮 */ @property ( ...
- iOS开发Quartz2D十二:手势解锁实例
一:效果如图: 二:代码: #import "ClockView.h" @interface ClockView() /** 存放的都是当前选中的按钮 */ @property ( ...
- iOS开发Quartz2D 十三:画板涂鸦
一:效果如图: 二:代码 #import "ViewController.h" #import "DrawView.h" #import "Handl ...
- iOS开发Quartz2D 三 进度条的应用
一:效果如图: 二:代码 #import "ViewController.h" #import "ProgressView.h" @interface View ...
- IOS开发之画图形
1 画线 2 画线第二个方法 相对方法1简洁 3 矩形 4 圆 5 弧线 6画文字(略) 7 画图片(略)
随机推荐
- 从”茄子快传”看应用程序怎样获取手机已安装程序的apk文件
"茄子快传"是联想开发的一款近距离文件共享软件.它通过wifi-direct(速度飞快,不须要联网)或者普通的网络(速度慢)在不同手机间传递文件. 不知为何.它就火了起来,火的也飞 ...
- Java总结之线程
[线程的基本概念] 线程是一个程序内部的顺序控制流. 线程和进程的差别: 每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销. 线程能够看成是轻量级的进程,同一类线程 ...
- jquery--this
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- ubuntu-虚拟机分辨率设定
前两天下载的虚拟机,一直调节不好分辨率,就是说,全屏的时候,虚拟机要么是不能充满屏幕,要么就是在屏幕充满的时候,会出现显示不全,需要滚动条,给人的体验非常的不好.自己调节了好长时间都没有刚好合适的尺寸 ...
- Android学习笔记进阶18之画图并保存图片到本地
1.首先创建一个Bitmap图片,并指定大小: 2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可: 3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...
- Elasticsearch之es学习工作中遇到的坑(陆续更新)
1:es集群脑裂问题(不要用外网ip,节点角色不要混用) 原因1:阿里云服务器,外网有时候不稳定. 解决方案:单独采购服务器,内网安装 原因2:master和node节点没有分开 解决方案: 分角色: ...
- mahout用到的典型测试数据集
http://archive.ics.uci.edu/ml/databases/synthetic_control/ 继续
- Spider_selenium
json模块 什么是json? javascript中的对象和数组 对象:{key:value}取值:对象名.key 数组:[...,...]取值:数组[索引值] 作用 json格式的字符串和Pyth ...
- 老调重弹:JDBC系列 之 <驱动载入原理全面解析>
前言 近期在研究Mybatis框架,因为该框架基于JDBC.想要非常好地理解和学习Mybatis,必需要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来.好好总结一番,作为自己的笔记,也是给 ...
- JSP与Servlet的介绍说明
什么是Servlet和JSP 用Java开发Web应用程序时用到的技术主要有两种,即Servlet和JSP. Servlet是在服务器端执行的Java程序,一个被称为Servlet容器的程序(其实就是 ...