Quartz2D是跨平台的,同时支持iOS与Mac。

支持圆型裁剪,可以实现圆形头像等功能,也支持手势解锁、折线图等的制作。

对于复杂的UI界面,还可以通过Quartz2D将控件内部的结构画出来,可用于自定义控件。

实际上iOS大部分控件都是通过Quartz2D画出来的,一个重要价值是自定义view。

一些基础概念:

1.图形上下文(Graphics Context):是CGContextRef类型数据

能保存绘图信息、绘图状态,决定绘制的输出目标,可以输出到文件或者窗口。

绘制好的图像先保存到图形上下文,再显示到输出目标。

Tip:相同的图像,经过不同的图形上下文,就可以显示到不同的地方。

Quartz2D支持的类型:Bitmap、PDF、Window、Layer、Printer.

2.自定义view

拥有图形上下文,并且与view有关。

步骤:

1.新建一个类,继承自UIView。

2.实现drawRect: rect方法画图。

3.须知:

1.后面绘制的部分覆盖前面绘制的部分。

2.Quartz2D的API是纯C代码。

3.Quartz2D来自CoreGraphics框架。

4.数据类型和函数基本都是以CG开头。

重写UIView的drawRect方法,可以绘制图形,绘制直线的方法:

1.绘制直线

以CGContext开头的,MoveToPoint、AddLineToPoint以及StrokePath方法

Tip:如果要画独立的直线,只要多次使用MoveToPoint即可。

Tip:drawRect函数在View第一次显示到屏幕上的时候会调用一次,重绘时也会调用一次。

- (void)drawRect:(CGRect)rect {

    // 1.获得图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 2.拼接图形(路径)
// 2.1设定起点
CGContextMoveToPoint(ctx, 10, 10);
// 2.2添加一条线从起点到(100,100)
CGContextAddLineToPoint(ctx, 100, 100);
// 2.3从上次终点继续绘制
CGContextAddLineToPoint(ctx, 150, 40);
// 2.4回到起点,关闭路径
CGContextAddLineToPoint(ctx, 10, 10);
// 3.渲染显示到view上,stroke是空心的形式。
CGContextStrokePath(ctx); }

2.绘制矩形:

CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));

Tip:Stroke方法画的是空心图形,将Stroke换为Fill可得到填充图形。

3.设置状态的代码(颜色、粗细):

Tip:设置状态的代码一定要放在渲染的前面,放在绘制函数的前后都可以。

3.1设置线宽:

CGContextSetLineWidth(ctx, 10);

3.2设置颜色:有Stroke和Fill两种方式,注意小数是 x / 255.0。

CGContextSetRGBStrokeColor(ctx, 255/255.0, 125/255.0, 0.0, 1.0)

Tip:状态只在渲染的时候确定,因此多个状态不同的内容应该渲染多次。

3.3线段头尾样式(圆形):三中,Miter是默认的发射状(方形)、Round为圆形、Bevel为裁剪。

CGContextSetLineCap(ctx, kCGLineCapRound);

连接点样式:

CGContextSetLineJoin(ctx, kCGLineJoinRound);

Tip:如果使用多次渲染,那么之前绘制的路径尾就无法继续使用了,应该重新确立起点。

Tip:CMYK是印刷色彩颜色,由青、品红、黄、黑构成,RGB由红绿蓝构成。

设置颜色的一个简便方法:

使用UIColor对象的setStroke与setFill方法:如果写set则是全部设置。

[[UIColor redColor] setStroke];

4.绘制圆和椭圆:通过外接矩形确定。

    // 圆形
CGContextAddEllipseInRect(ctx, CGRectMake(10, 10, 60, 60));
// 椭圆
CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 50));

5.绘制圆弧:

/**
* 绘制圆弧
*
* @param c#> 图形上下文 description#>
* @param x#> 圆心x description#>
* @param y#> 圆心y description#>
* @param radius#> 半径 description#>
* @param startAngle#> 起始角度 description#>
* @param endAngle#> 结束角度 description#>
* @param clockwise#> 圆弧生长方向 0顺 1逆 description#>
*
*/
CGContextAddArc(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#int clockwise#>);

需要注意的是角度为弧度,应该通过系统的宏来换算:M_PI_2表示二分之PI,M_1_PI表示0.1PI。

另外注意一点这里的角度和数学定义不同,顺时针为正角度,逆时针为负角度。

6.图片和文字结合:

Tip:Quartz2D的坐标系和数学上一致,但是UIKit框架做了转换,和屏幕坐标系一致都是左上角为(0,0),因此使用纯C语言绘制出来的东西是倒着的。

利用OC来绘制字符串不需要调用和上下文:

NSString *str = @"一段文字";
[str drawAtPoint:CGPointMake(0, 0) withAttributes:nil];

想把文字放到矩形框内,使用drawInRect,还可以自动换行。

withAttributes是对状态的设置,注意要传入字典。

参数已经定义成字符串常量:

NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSForegroundColorAttributeName] = [UIColor whiteColor];
[str drawAtPoint:CGPointMake(0, 0) withAttributes:attrs];

常见的属性:

NSForegroundColorAttributeName为文字颜色。

NSFontAttributeName为字体。

图片的绘制:

直接绘制:

[UIImage imageNamed:@"me"];
[image drawInRect:CGRectMake(0, 0, 150, 150)];

平铺:

[UIImage imageNamed:@"me"];
[image drawAsPatternInRect:CGRectMake(0, 0, 150, 150)];

(四十七)Quartz2D引擎初步的更多相关文章

  1. NeHe OpenGL教程 第四十七课:CG顶点脚本

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Gradle 1.12用户指南翻译——第四十七章. Build Init 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. Java进阶(四十七)Socket通信

    Java进阶(四十七)Socket通信   今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...

  4. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  5. C# 优化程序的四十七种方法

    一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量) ...

  6. 《构建之法》第四&十七章读书笔记

     <构建之法>第四&十七章读书笔记 一.         前言 再次阅读<构建之法>,愈发被其中生动有趣的举例吸引.作为一本给予软件工程学生的书籍,其不以枯燥的理论知识 ...

  7. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  8. “全栈2019”Java第四十七章:继承与方法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数

    孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...

随机推荐

  1. leetcode刷题笔记342 4的幂

    题目描述: 给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂. 示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false. 问题进阶:你能不使 ...

  2. Tomcat安装及问题排查方法

    简介: Apache Jakarta的开源项目 JSP/Servlet容器 安装: 1.1进入 Tomcat 官方下载地址 选择合适版本下载,并解压到本地. (备注)Tomcat 8.5 要求 JDK ...

  3. Node.js 流

    稳定性: 2 - 不稳定 流是一个抽象接口,在 Node 里被不同的对象实现.例如request to an HTTPserver 是流,stdout 是流.流是可读,可写,或者可读写.所有的流是 E ...

  4. 自定义支持多行显示的RadioGroup

    自定义支持多行显示的RadioGroup 原生的RadioGroup继承自LinearLayout,即只能支持一横排或者一竖排的排列显示RadioButton 现在改写RadioGroup,使它支持多 ...

  5. 独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!

    最近一年的工作,有很大的比重在做云平台的事情,简单来说,就是为公司内用户提供一个PaaS,用户可以在我们的云平台上方便的将单机服务程序扩展为多实例程序,以平台服务化的方式对外提供.在这里简单分享一下. ...

  6. android Spinner控件详解

    Spinner提供了从一个数据集合中快速选择一项值的办法.默认情况下Spinner显示的是当前选择的值,点击Spinner会弹出一个包含所有可选值的dropdown菜单,从该菜单中可以为Spinner ...

  7. Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置

    最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没 ...

  8. 【伯乐在线】Java线程面试题 Top 50

    本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特 ...

  9. 详解EBS接口开发之采购订单导入

    采购订单常用标准表简介 1.1   常用标准表 如下表中列出了与采购订单导入相关的表和说明: 表名 说明 其他信息 po.po_headers_all 采购订单头 采购订单号,采购类型,供应商,地点, ...

  10. Xcode8之后,苹果列出了最新App被拒十大原因

    开发者在开发应用程序之前,熟悉苹果审核应用的技术.内容以及设计准则是非常重要的,可以大大降低应用审核被拒的可能性. 最近,苹果通过一个专门的页面给出了截止2016年10月10日应用提交审核被拒的十大原 ...