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类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...
随机推荐
- The file will have its original line endings in your working directory.
在空仓库的情况下,add,出现一下问题 The file will have its original line endings in your working directory. 当报这个警告时是 ...
- Java_常用API
1.基本类型包装类 1.1 概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型 ...
- QQ邮件定时发送天气预报
1.首先利用request库去请求数据,天气预报使用的是和风天气的API(www.heweather.com/douments/api/s6/weather-forecast) 2.利用python的 ...
- PHP的钩子实现解析
钩子是编程里一个常见的概念,非常的重要.它使得系统变得非常容易拓展(而不用理解其内部的实现机理,这样可以减少很多工作量).只要有一个钩子样本,能很容易仿照第一个钩子快速的编写第二个钩子,这里对钩子进行 ...
- bzoj2660: [Beijing wc2012]最多的方案
题目链接 bzoj2660: [Beijing wc2012]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...
- luoguP4503 [CTSC2014]企鹅QQ hash
既然只有一位的不同,那么我们可以枚举这一位.... 我们只需要快速地计算去掉某一位的$hash$值.... 由于$hash(S) = \sum s[i] * seed^i$,因此去掉第$i$位的权值只 ...
- IDEA JSP项目构建及学习心得
近期学习的东西比较杂乱,导致了很多东西都有些忘却.在这里记录一份心得. 简而言之JSP也就是Java代码在页面上的一种呈现方式,用于Web项目的前台展示. 在这里不做过多的阐述. MVC设计模式,Se ...
- 升级Tornado到4后weibo oauth登录不了
把 Tornado 升级到4后,发现正常运行的微博登录不可以了. 原因是4已经移除 RequestHandler.async_callback and WebSocketHandler.async_c ...
- HDU 5692 Snacks bfs版本dfs序 线段树
Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...
- Codeforces Round #196 (Div. 2) A. Puzzles 水题
A. Puzzles Time Limit: 2 Sec Memory Limit: 60 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...