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的更多相关文章

  1. Quartz 2D中的基本图形绘制

    在iOS中绘图一般分为以下几个步骤: 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 在UIKit中默认已经为我们准备好了一个图形上下文 ...

  2. iOS 2D绘图 (Quartz 2D) 概述

    本篇博客原文地址:http://blog.csdn.net/hello_hwc?viewmode=list 由于自己的项目需要,从网络上下载了许多关于绘制图形的demo,只是用在自己的项目中,很多地方 ...

  3. Quartz 2d绘图

    今天看了一下Quartz 2D绘图,我只想说:不要把绘图和动画那些东西当做一个很复杂的东西,其实只要你认真看还是可以理解的.他们并不难.啰嗦了几句,现在直接进入正题: 前提是我们必须新建一个singl ...

  4. iOS 2D绘图详解(Quartz 2D)之概述

    前言:最近在研究自定义控件,由于想要彻底的定制控件的视图还是要继承UIView,虽然对CALayer及其子类很熟练,但是对Quartz 2D这个强大的框架仍然概念模棱两可.于是,决定学习下,暂定7篇文 ...

  5. iOS - Quartz 2D 二维绘图

    1.Quartz 2D 简介 Quartz 2D 属于 Core Graphics(所以大多数相关方法的都是以 CG 开头),是 iOS/Mac OSX 提供的在内核之上的强大的 2D 绘图引擎,并且 ...

  6. Quartz 2D绘制简单图形

    在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UI ...

  7. Quartz 2D Programming Guide

    Quartz 2D Programming  Guide 官方文档: Quartz 2D Programming Guide 译文: Quartz 2D编程指南(1) - 概览 Quartz 2D编程 ...

  8. Quartz 2D编程指南(4) - 颜色和颜色空间

    不同的设备(显示器.打印机.扫描仪.摄像头)处理颜色的方式是不同的.每种设备都有其所能支持的颜色值范围.一种设备能支持的颜色可能在其它设备中无法支持.为了有效的使用颜色及理解Quartz 2D中用于颜 ...

  9. 关于Quartz 2D绘图的简单使用

    Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,Quartz 2D的API可以实现许多功能,如:基于路径的绘图.透明度.阴影.颜色管理.反锯齿.PDF文档生成和PDF元 ...

随机推荐

  1. 01-03-01【Nhibernate (版本3.3.1.4000) 出入江湖】id标签的unsaved-value属性

    父表 <class name="Model.Customer, Model" discriminator-value="0"> <!--uns ...

  2. HDU 4678 Mine (2013多校8 1003题 博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  3. CSS隐藏元素的几个方法(display,visibility)的区别

    在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击. { display: none; /* 不占据空间,无法点击 */ } ...

  4. 查找可用的谷歌IP地址

    在终端下运行命令就可以: nslookup www.google.cn 就可以找到

  5. Linux/UNIX线程(2)

    线程(2) 线程同步 当多个控制线程共享同样内存时,须要确保每一个线程看到一致的数据视图.假设每一个线程使用的变量都是其它线程不会读取或改动的,那么就不在一致性问题. 当两个或多个线程试图在同一时间改 ...

  6. 微信公众平台——获取access_token、expires_in

    微信公众平台——获取access_token.expires_in 在微信公众平台接口开发中,Access Token占据着重要地位,它相当于进入各种接口的邀请,拿到这个钥匙才拥有调用其他各种特殊接口 ...

  7. 【mysql】mysql统计查询count的效率优化问题

    mysql统计查询count的效率优化问题 涉及到一个问题 就是 mysql的二级索引的问题,聚簇索引和非聚簇索引 引申地址:https://www.cnblogs.com/sxdcgaq8080/p ...

  8. Javascript:父类可以调用子类吗?

    问:父类可以调用子类吗? 答:可以,经典的模板方法模式就是用的这个特性.

  9. javascript基础编程の变量、对象、数据类型及函数

    在web标准中.网页由结构.表现形式和行为三个部分组成. 结构标准---->XHTML: 表现形式标准----->CSS: 行为标准----->javascript: javascr ...

  10. Andorid之Annotation框架初使用(一)

    1. 设置Activity的布局 @EActivity(R.layout.main) public class MyActivity extends Activity {} 注: 此时在Android ...