Quartz 2D中CGContextSaveGState与UIGraphicsPushContext
CGContextRef:
An opaque type that represents a Quartz 2D drawing environment.
Graphics Context是图形上下文,可以将其理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,将画布放到我们的view中显示即可,view看作是一个画框.
CGContextSaveGState与UIGraphicsPushContext很容易混淆。非专门研究作图的可以说平时工程中几乎用不到 Quartz 2D 的这两个函数。
一般这俩都各自和对应的函数成对出现的:
CGContextSaveGState(context); 、CGContextRestoreGState(context);
UIGraphicsPushContext(ctx);、UIGraphicsPopContext();
那么这俩是做什么的呢,看第二对 是不是 有关键字眼 push pop ,可想而知 这俩的本质和压栈出栈有关。那么压得是什么呢。
UIGraphicsPushContext:压栈当前的绘制对象,生成新的绘制图层
CGContextSaveGState:压栈当前的绘制状态
一般简单的图形是不用这两对函数的,完全可以在view的drawRect方法里面,先画一个图形,然后再接着画另一个图形。只有更复杂的绘制才会用到这写方法,比如绘图中用到了UIRectClip、CGContextClip 来限定范围的话就需要CGContextSaveGState(context)、CGContextRestoreGState(context)来配合,因为你如果clip后,那么就限定了 只能在view的内部的特定的一部分区域画图(假设区域叫a),但是我想在b区域再画另一个东西,如果不将画布恢复出来除非先画b区域,再剪裁出a区域 画a中的内容。如下图:

但是如果我非得先剪裁a然后再画b怎么办?
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetLineCap(currentContext, kCGLineCapRound);
CGContextSetStrokeColorWithColor(currentContext, [UIColor blueColor].CGColor);
CGContextSetLineWidth(currentContext, 10);
CGContextSaveGState(currentContext);//存储这之前的context的状态
UIRectClip(CGRectMake(30,33,50,60));//修剪
CGContextSetStrokeColorWithColor(currentContext, [UIColor redColor].CGColor);
CGContextSetLineWidth(currentContext, 16);
CGContextMoveToPoint(currentContext, 20, 60);
CGContextAddLineToPoint(currentContext, 300, 60);
CGContextStrokePath(currentContext);
CGContextRestoreGState(currentContext);// 恢复到之前未修剪之前的context
CGContextMoveToPoint(currentContext, 280, 20);
CGContextAddLineToPoint(currentContext, 280, 180);
CGContextStrokePath(currentContext);
}
得到效果如图:

去掉clip 试下,发下 两条线在不做限制的时候是相交的。可以好好体会下。
关于UIGraphicsPushContext的demo,欢迎把链接写到评论中。有勘误的也欢迎指出来。
相关传送门
https://www.cnblogs.com/isItOk/p/6120181.html
好友相关链接
IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
http://blog.csdn.net/rhljiayou/article/details/9919713
客串相关链接
http://blog.csdn.net/rhljiayou/article/details/7212620
Quartz 2D中CGContextSaveGState与UIGraphicsPushContext的更多相关文章
- Quartz 2D中的基本图形绘制
在iOS中绘图一般分为以下几个步骤: 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 在UIKit中默认已经为我们准备好了一个图形上下文 ...
- iOS 2D绘图 (Quartz 2D) 概述
本篇博客原文地址:http://blog.csdn.net/hello_hwc?viewmode=list 由于自己的项目需要,从网络上下载了许多关于绘制图形的demo,只是用在自己的项目中,很多地方 ...
- Quartz 2d绘图
今天看了一下Quartz 2D绘图,我只想说:不要把绘图和动画那些东西当做一个很复杂的东西,其实只要你认真看还是可以理解的.他们并不难.啰嗦了几句,现在直接进入正题: 前提是我们必须新建一个singl ...
- iOS 2D绘图详解(Quartz 2D)之概述
前言:最近在研究自定义控件,由于想要彻底的定制控件的视图还是要继承UIView,虽然对CALayer及其子类很熟练,但是对Quartz 2D这个强大的框架仍然概念模棱两可.于是,决定学习下,暂定7篇文 ...
- iOS - Quartz 2D 二维绘图
1.Quartz 2D 简介 Quartz 2D 属于 Core Graphics(所以大多数相关方法的都是以 CG 开头),是 iOS/Mac OSX 提供的在内核之上的强大的 2D 绘图引擎,并且 ...
- Quartz 2D绘制简单图形
在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UI ...
- Quartz 2D Programming Guide
Quartz 2D Programming Guide 官方文档: Quartz 2D Programming Guide 译文: Quartz 2D编程指南(1) - 概览 Quartz 2D编程 ...
- Quartz 2D编程指南(4) - 颜色和颜色空间
不同的设备(显示器.打印机.扫描仪.摄像头)处理颜色的方式是不同的.每种设备都有其所能支持的颜色值范围.一种设备能支持的颜色可能在其它设备中无法支持.为了有效的使用颜色及理解Quartz 2D中用于颜 ...
- 关于Quartz 2D绘图的简单使用
Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,Quartz 2D的API可以实现许多功能,如:基于路径的绘图.透明度.阴影.颜色管理.反锯齿.PDF文档生成和PDF元 ...
随机推荐
- 开发笔记:python与随机数(转)
这些天需要用到从一堆数中随机提取几个数,于是重新研究了下random模块. 下面介绍下random中常见的函数. 前提:需要导入random模块 >>>import random 1 ...
- Ubuntu环境下配置GCC
Ubuntu网络环境下安装GCC及其头文件步骤: 1.Ubuntu环境下配置GCC 刚装好的GCC什么都不能编译,因为没有一些必须的头文件,所以要安装build-essential,安装了这个包会安装 ...
- Sublime的中文GBK显示乱码的解决方法
import urllib2,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd ...
- mysql sql长度限制解决
mysql sql长度限制解决 今天发现了一个错误: Could not execute JDBC batch update 最后发现原因是SQL语句长度大于1M,而我机器上的mysql是 ...
- Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别
转:http://www.crifan.com/linux_system_in__dev__mtd_and__dev__mtdblock_distinction_character_devices_a ...
- C#编程兵书
<C#编程兵书> 基本信息 作者: 张志强 胡君 丛书名: 程序员藏经阁 出版社:电子工业出版社 ISBN:9787121207402 上架时间:2013-8-26 出版日期:2013 年 ...
- T-sql 根据bak文件恢复新建数据库
利用bak文件恢复新建数据库: 1:利用sqlserver界面管理工具恢复,在操作2005以上的版本可以讲界面的操作过程生成sql语句(本人在此徘徊了好久,得一位博友提醒才恍然大悟); 2:利用sql ...
- MD5在线查询的实现
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' 快速查询md5值工具,通过模拟浏览器发包请求http://cmd5.com和 http://xmd5 ...
- jquery操作CSS样式全记录
$(this).click(function(){ if($(this).hasClass(“zxx_fri_on”)){ $(this).removeClass(“zxx_fri_on”); ...
- c#中this的用法
在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 也可以用this来做为参数状当前实例做为参数传入方法. 还可以通过this[]来声明索引器 下 ...