iOS开发-Quartz2D初识
Quartz2D如果单独的从Quartz,那么会发现Quartz是一个开源的Java作业调度框架,单独从英文翻译的角度来看的话Quartz的英文是石英,如果有的时候不小心搜索会发现手表推荐。本文中介绍的Quartz是位于MAC OS X的Drawin核心之上的绘图层,有时候也认为是CoreGraphics。Quartz直接地支持Aqua,借由显示2D绘图图形来创建用户接口,包含实时绘制(rendering)和次像素(sub-pixel)精准的反锯齿,由Quartz Compositor和Quartz 2D组件组成。
Quartz2D简介
Quartz Compositor是指合成视窗系统,管理和合成幕后视窗视频来创建Mac OS X用户接口,Quartz 2D以PDF的规范为基础的图形库,用来绘制二维文字和图形。
Quartz 2D是在MAC OS X中的主要绘图函式库。它取代早期版本的MAC OS(现在称为"Classic")所使用的QuickDraw。Quartz 2D是以Adobe PDF(一种统一的档案格式,不管在那个平台上建立,在任何来源的文件中保留所有的字型,格式,颜色,以及绘图)1.4版本为基础。他是源自NeXT的Display PostScript后代。Quartz 2D与QuickDraw在数个关键领域有所不同。
QuickDraw天生地以raster图形为基础,基本的绘图元素是像素。Quartz 2D替代地使用更数学的方法,座标空间是二维实数所定义的抽象观念。在这个空间的点可以被连线起来形成路径,像是直线,贝兹曲线等等。要在显示器上建立实际上的影像,那些路径就会被点阵化在显示器装置分辨率下用来产生像素。这样允许相同的绘图指令可以在任何装置上,使用可以得到的最佳分辨率,来产生相同的输出。就像在PostScript,路径可以被划线成为外框,直线以此类推,且封闭的路径可以被填满而创造出实体的形状。文字是简单地由路径产生,然后形成文字标记的形状。
在iOS上,所有的绘制,无论是否采用OpenGL、Quartz、UIKit、或者 Core Animation—都发生在UIView对象的区域内。视图定义绘制发生的屏幕区域。可以自己写一个集成UIView的类,然后自己绘制需要的图形(如三角形),绘制文字,绘制图片,读取PDF,截图(UIImagePicker截取图片)等常用功能。
Quartz2D工作原理
一般有点开发经验的应该都会听说过上下文,搞过ASP.NET MVC的都知道,微软提供的EF上下文简直就是开发者福利,其他语言也有,大概就是两个对象相互操作的一个桥梁,EF是数据层和控制器层交互必备,iOS中如果想绘制图片,也离不开上下文,具体先来看一段代码,需要新建一个View继承子UIView,默认的就会有一个drawRect方法
调用自定义的View中的drawRect:方法之前,视图对象会自动配置其绘制环境,使代码可以立即进行绘制。作为这些配置的一部分,UIView对象会为当前绘制环境创建一个图形上下文(对应于CGContextRef封装类型)。该图形上下文包含绘制系统执行后续绘制命令所需要的信息,定义了各种基本的绘制属性,比如绘制使用的颜色、裁剪区域、线的宽度及风格信息、字体信息、合成选项、以及几个其它信息。
- (void)drawRect:(CGRect)rect {
CGContextRef context = ();
//设置起始点
CGContextMoveToPoint (context, 160, 100);
CGContextAddLineToPoint (context, 100, 180);
CGContextAddLineToPoint (context, 160, 180);
// 设置边界
[[UIColor blackColor] setStroke];
//填充颜色
[[UIColor redColor] setFill];
//绘制路径
CGContextDrawPath(context, kCGPathFillStroke);
}
Quartz2D是一个C语言框架,其API是纯C语⾔的,Quartz2D的API来自于Core Graphics框架,代码中实例化了一个UIGraphicsGetCurrentContext上下文,绘制图形,通过上下文设置图形的输出路径,最终效果就是一个直角三角形:

代码的调用很简单,如果方法不是很熟悉可以查找一下,大概原理还是比较简单,如果不是很清晰,可以接下来看一张苹果官网的图:

有五种可用的上下文实例供我们选择使用,Printer,PDF,Bitmap,Layer,Window使用,Window,Printer用于OS X~开发中一般用到是Btimap,Layer较多,关于PDF的需要根据业务来看,接下来再看一段代码就是一个圆形:
//获取上下文
CGContextRef context = UIGraphicsGetCurrentContext(); CGRect rect = CGRectMake(50, 200, 200, 200);
//是否有边框
// UIRectFrame(rect);
//矩形中添加一个椭圆
CGContextAddEllipseInRect(context, rect); [[UIColor greenColor] setStroke]; //设置绿色背景
[[UIColor greenColor] setFill]; // 3. 绘制路径
CGContextDrawPath(context, kCGPathFillStroke);
最终效果如下:

最常见的应该是设置一条直线:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, 1); //线宽
CGContextSetAllowsAntialiasing(context, true);
CGContextSetRGBStrokeColor(context,0, 0,0,0.8); //线的颜色
CGContextBeginPath(context);
CGContextMoveToPoint(context,100,outerFrame.size.height/3); //起点坐标
CGContextAddLineToPoint(context, 100,outerFrame.size.height*2/3); //终点坐标
CGContextStrokePath(context);
}
重写一般都是都放在drawRect中执行,如果没有加载出来对应的,我们应该通过setNeedsDisplay调用drawRect方法~
iOS开发-Quartz2D初识的更多相关文章
- iOS开发 - Quartz2D画图
Quartz 2D简单介绍 是一个二维画图引擎,同一时候支持iOS和Mac系统 Quartz 2D能完毕的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- iOS开发Quartz2D 十三:画板涂鸦
一:效果如图: 二:代码 #import "ViewController.h" #import "DrawView.h" #import "Handl ...
- iOS开发Quartz2D之十二:手势解锁实例
一:效果如图: 二:代码: #import "ClockView.h" @interface ClockView() /** 存放的都是当前选中的按钮 */ @property ( ...
- iOS开发Quartz2D十二:手势解锁实例
一:效果如图: 二:代码: #import "ClockView.h" @interface ClockView() /** 存放的都是当前选中的按钮 */ @property ( ...
- iOS开发Quartz2D之八:图形上下文状态栈
#import "DrawView.h" @implementation DrawView - (void)drawRect:(CGRect)rect { // Drawing c ...
- iOS开发Quartz2D之 七:雪花效果
#import "VCView.h" @implementation VCView -(void)awakeFromNib { //[NSTimer scheduledTimerW ...
- iOS开发Quartz2D 三 进度条的应用
一:效果如图: 二:代码 #import "ViewController.h" #import "ProgressView.h" @interface View ...
- iOS开发——UI进阶篇(十五)Quartz2D介绍
一.Quartz2D简介 1.什么是Quartz2DQuartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作绘制图形 : 线条\三角形\矩形\圆\弧等绘制文字绘 ...
- iOS开发UI篇—Quartz2D使用(绘制基本图形)
iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...
随机推荐
- Oceanus:美团HTTP流量定制化路由的实践
背景简述 Oceanus是美团基础架构部研发的统一HTTP服务治理框架,基于Nginx和ngx_lua扩展,主要提供服务注册与发现.动态负载均衡.可视化管理.定制化路由.安全反扒.session ID ...
- Python 随机数函数
random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 描述 random() 方法返回随机生成的一个实数,它在[0,1)范围 ...
- 机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合
分享一下 线性回归中 欠拟合 和 过拟合 是怎么回事~为了解决欠拟合的情 经常要提高线性的次数建立模型拟合曲线, 次数过高会导致过拟合,次数不够会欠拟合.再建立高次函数时候,要利用多项式特征生成器 生 ...
- Linux内核代码
全局描述符表GDT(Global Descriptor Table): (1)在整个系统中,全局描述符表(注意这里是表,表只有一张)GDT只有一张(一个处理器对应一个GDT). (2)GDT可以被放在 ...
- 深入理解python中的select模块
简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...
- 【二分】【预处理】zoj4029 Now Loading!!!
题意:给定一个序列,多次询问 将a数组从小到大排序,下面那个值只有不超过32种,于是预处理f[i][j],表示分母为i时,aj/i的前缀和是多少. 然后对于一个给定的p,一定将分母划分成了一些连续的段 ...
- php安装编译时 configure: error: Cannot find OpenSSL's <evp.h>
=============================================== yum install error: protected multilib versions error ...
- Codeforces Round #243 (Div. 1)A. Sereja and Swaps 暴力
A. Sereja and Swaps time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Spring Boot项目的Logback配置文件使用yaml格式
1.普通的Spring项目使用logback默认用properties文件做为配置变量. 2.如果非要用yaml文件,那么可以转成Spring Boot项目,天生无缝结合 3.没办法,如果项目配置文件 ...
- Spartan-6 - How to connect *CMP* pins?
http://www.xilinx.com/support/answers/35171.htm How to connect the following pins in my design? CMPM ...