UI高级
Quartz2D

http://ios.itcast.cn  iOS学院

掌握

drawRect:方法的使用

常见图形的绘制:线条、多边形、圆

绘图状态的设置:文字颜色、线宽等

图形上下文状态的保存与恢复(图形上下文栈)

图片裁剪

截图

什么是Quartz2D

Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统

Quartz 2D能完成的工作

Ø绘制图形 : 线条\三角形\矩形\圆\弧等
Ø绘制文字
Ø绘制\生成图片(图像)
Ø读取\生成PDF
Ø截图\裁剪图片
Ø自定义UI控件
Ø… …

Quartz2D实例

Quartz 2D能做很多强大的事情,例如

Ø裁剪图片

Quartz2D实例

Ø涂鸦\画板

Quartz2D实例

Ø手势解锁
Ø

Quartz2D实例

Ø报表:折线图\饼状图\柱状图
Ø

Quartz2D在iOS开发中的价值

为了便于搭建美观的UI界面,iOS提供了UIKit框架,里面有各种各样的UI控件

ØUILabel:显示文字
ØUIImageView:显示图片
ØUIButton:同时显示图片和文字(能点击)
Ø… …
Ø

利用UIKit框架提供的控件,拼拼凑凑,能搭建和现实一些简单、常见的UI界面

但是,有些UI界面极其复杂、而且比较个性化,用普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,自定义控件的样子

其实,iOS中大部分控件的内容都是通过Quartz2D画出来的

因此,Quartz2D在iOS开发中很重要的一个价值是:自定义view(自定义UI控件)

图形上下文

图形上下文(Graphics Context):是一个CGContextRef类型的数据

图形上下文的作用

Ø保存绘图信息、绘图状态
Ø决定绘制的输出目标(绘制到什么地方去?)

(输出目标可以是PDF文件、Bitmap或者显示器的窗口上)

相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上

图形上下文

Quartz2D提供了以下几种类型的Graphics Context:

ØBitmap
Graphics Context
ØPDF
Graphics Context
ØWindow
Graphics Context
ØLayer
Graphics Context
ØPrinter
Graphics Context

自定义view

如何利用Quartz2D自定义view?(自定义UI控件)

如何利用Quartz2D绘制东西到view上?

Ø首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去
Ø其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面
Ø

自定义view的步骤

Ø新建一个类,继承自UIView
Ø实现- (void)drawRect:(CGRect)rect方法,然后在这个方法中
u取得跟当前view相关联的图形上下文
u绘制相应的图形内容
u利用图形上下文将绘制的所有内容渲染显示到view上面

drawRect:

为什么要实现drawRect:方法才能绘图到view上?

Ø因为在drawRect:方法中才能取得跟view相关联的图形上下文
Ø

drawRect:方法在什么时候被调用?

Ø当view第一次显示到屏幕上时(被加到UIWindow上显示出来)
Ø调用view的setNeedsDisplay或者setNeedsDisplayInRect:时

绘图顺序

Quartz2D须知

Quartz2D的API是纯C语言的

Quartz2D的API来自于Core
Graphics框架

数据类型和函数基本都以CG作为前缀

ØCGContextRef
ØCGPathRef
ØCGContextStrokePath(ctx);
Ø……

drawRect:中取得的上下文

在drawRect:方法中取得上下文后,就可以绘制东西到view上

View内部有个layer(图层)属性,drawRect:方法中取得的是一个Layer Graphics Context,因此,绘制的东西其实是绘制到view的layer上去了

View之所以能显示东西,完全是因为它内部的layer

Quartz2D绘图的代码步骤

1.获得图形上下文

CGContextRef ctx
= UIGraphicsGetCurrentContext();

2.拼接路径(下面代码是搞一条线段)

CGContextMoveToPoint(ctx,
10, 10);

CGContextAddLineToPoint(ctx,
100, 100);

3.绘制路径

CGContextStrokePath(ctx); //
CGContextFillPath(ctx);

常用拼接路径函数

新建一个起点

void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)

添加新的线段到某个点

void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)

添加一个矩形

void CGContextAddRect(CGContextRef c, CGRect rect)

添加一个椭圆

void CGContextAddEllipseInRect(CGContextRef context, CGRect rect)

添加一个圆弧

void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y,

CGFloat radius, CGFloat startAngle, CGFloat endAngle, int
clockwise)

常用绘制路径函数

Mode参数决定绘制的模式

void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode)

绘制空心路径

void CGContextStrokePath(CGContextRef c)

绘制实心路径

void CGContextFillPath(CGContextRef c)

提示:一般以CGContextDraw、CGContextStroke、CGContextFill开头的函数,都是用来绘制路径的

图形上下文栈的操作

将当前的上下文copy一份,保存到栈顶(那个栈叫做”图形上下文栈”)

void CGContextSaveGState(CGContextRef c)

将栈顶的上下文出栈,替换掉当前的上下文

void CGContextRestoreGState(CGContextRef c)

矩阵操作

利用矩阵操作,能让绘制到上下文中的所有路径一起发生变化

Ø缩放

void CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)

Ø旋转

void CGContextRotateCTM(CGContextRef c, CGFloat
angle)

Ø
Ø平移

void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)

Quartz2D的内存管理

使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露

使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放

如果retain了一个对象,不再使用时,需要将其release掉

可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。

也可以使用Core
Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数

图片水印

水印:在图片上加的防止他人盗图的半透明logo、文字、图标

水印的作用

Ø告诉你这个图片从哪来的
Ø主要是一些网站为了版权问题、广告而添加的

图片水印

有时候,在手机客户端app中也需要用到水印技术

比如,用户拍完照片后,可以在照片上打个水印,标识这个图片是属于哪个用户的

实现方式:利用Quartz2D,将水印(文字、LOGO)画到图片的右下角

核心代码

Ø开启一个基于位图的图形上下文

void     UIGraphicsBeginImageContextWithOptions(CGSize
size, BOOL
opaque, CGFloat
scale)

Ø从上下文中取得图片(UIImage)

UIImage* UIGraphicsGetImageFromCurrentImageContext();

Ø结束基于位图的图形上下文

void     UIGraphicsEndImageContext();

图片裁剪

很多app的头像,都是圆形的

图片裁剪

这时需要把一张普通的图片刻意裁剪成圆形

核心代码

void CGContextClip(CGContextRef c)

将当前上下所绘制的路径裁剪出来(超出这个裁剪区域的都不能显示)

屏幕截图

有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏

Q & A

人生就像卫生纸,没事的时候,尽量少扯; 时间就像卫生纸,看着挺多,用着用着就没了...

Jonathan_Lee

Quartz2D常见图形的绘制:线条、多边形、圆的更多相关文章

  1. HTML5<canvas>标签:使用canvas元素在网页上绘制线条和圆(1)

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  2. iOS边练边学--(Quartz2D)基本图形的绘制#附加自定义进度控件的练习

    一.Quartz2D使用须知 Quartz2D的API是纯C语言的 Quartz2D的API来自于Core Graphics框架 二.<1>通过原始的方法(C语言)绘制简单图形--了解 & ...

  3. GDI基础(1):绘制线条和图形

    1. 绘制一个像素点:SetPixel(). 绘制直线:MoveTo(),LineTo(). 绘制多个首尾相连的线:Polyline(). 绘制矩形:FrameRect(),Rectangle(),F ...

  4. iOS学习——Quartz2D学习之UIKit绘制

    iOS学习——Quartz2D学习之UIKit绘制 1.总述 在IOS中绘图技术主要包括:UIKit.Quartz 2D.Core Animation和OpenGL ES.其中Core Animati ...

  5. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能

    权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...

  6. iOS 动画绘制线条颜色渐变的折线图

    效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有 ...

  7. IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)

    在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...

  8. css写的常见图形

    .aly-tooltip { display: inline-block; padding: 5px; padding-left: 15px; padding-right: 15px; backgro ...

  9. 使用html5 Canvas绘制线条(直线、折线等)

    使用html5 Canvas绘制直线所需的CanvasRenderingContext2D对象的主要属性和方法(有"()"者为方法)如下: 属性或方法 基本描述 strokeSty ...

随机推荐

  1. IT基础架构规划方案三(IT基础软件和系统规划)

    IT基础软件和系统规划 操作系统选型规划方案 根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选型规划,根据不同的 ...

  2. [已解决] github merge指定commit

    比如说有两个branch,分别是master和m1,我们在m1上修改的bug怎么merge到master上呢, 怎么merge我不知道,但是有另外一个命令可以做到,比如m1做commit,sha-1为 ...

  3. SSDP

    SSDP:Simple Service Discover Protocol,简单服务发现协议,PC机只要网口UP,就会通过该协议寻找可用的网络服务.PC机发出的报文基于UDP协议的1900端口发送组播 ...

  4. arguments的用法

    arguments 对象 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argument ...

  5. 原生 JavaScript 代码和Jquery实现对比

    下面就带大家一起看看在 IE 浏览器环境中如果使用原生 JavaScript 代码实现 jQuery 中的功能.如果你打算自己开发一个小的基础框架,可以好好参考一下这些代码的实现. 本文转载:http ...

  6. crm操作安全角色

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Crm.Sdk.Messages;     using System.Co ...

  7. 文档/视图(01):第一个Demo

    学习文档视图编程的第一个demo,程序比较简单,主要对文档模板,文档,视图等相互关系的一个了解. 功能:菜单添加一个[操作]项,然后新建四份空白文档,点击[操作]之后,在四份空白文档上面各绘制一个Bu ...

  8. 随笔 -- NIO -- 相关 -- 系统概述

    .打开Selector .打开ServerSocketChannel .获取与此Channel关联的ServerSocket并绑定地址 .设置Channel为非阻塞 .将Channel注册到Selec ...

  9. Java基础学习篇---------封装

    一.类和对象分配内存 二.Java中的内部类  : 可以直接去访问外部类的所有属性(包括私有成员) 1.Java中成员内部类 (1).内部类的方法可以直接访问外部类的类中的所有成员变量 (2).外部类 ...

  10. (转)如何在maven环境中设置JVM参数

    有时候我们需要设定maven环境下的JVM参数,以便通过maven执行的命令或启动的系统能得到它们需要的参数设定.比如:当我们使用jetty:run启动jetty服务器时,在进行热部署时会经常发生:J ...