什么是Quartz2D

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

2、Quartz 2D 能完成的工作:

  • 绘制图形 : 线条\三角形\矩形\圆\弧等

  • 绘制文字

  • 绘制\生成图片(图像)

  • 读取\生成PDF

  • 截图\裁剪图片

  • 自定义UI控件

图形上下文

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

2、图形上下文的作用:

  • 保存绘图信息、绘图状态

  • 决定绘制的输出目标(绘制到什么地方去?)

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

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

  • BitmapGraphics Context

  • PDFGraphics Context

  • WindowGraphics Context

  • LayerGraphics Context

  • PrinterGraphics Context

自定义view

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

  • 首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去

  • 其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面

2、自定义view的步骤

  • 新建一个类,继承自 UIView

  • 实现 - (void)drawRect:(CGRect)rect 方法,然后在这个方法中

    • 取得跟当前view相关联的图形上下文

    • 绘制相应的图形内容

    • 利用图形上下文将绘制的所有内容渲染显示到view上面

3、为什么要在 drawRect 里面绘图

  只有在这个方法里面才能获取到跟 View 的 layer 相关联的图形上下文

当这个View要显示的时候才会调用drawRect绘制图形

    注意:rect是当前控件的bounds

画线

1、步骤:

  • 获取图形上下文

  • 描述路径

  • 把路径添加到上下文

  • 渲染上下文

2、直线

 方式1:(最原始的绘图方式)

    // 1.获取图形上下文
// 目前我们所用的上下文都是以UIGraphics
// CGContextRef Ref:引用 CG:目前使用到的类型和函数 一般都是CG开头 CoreGraphics
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.描述路径
// 创建路径
CGMutablePathRef path = CGPathCreateMutable(); // 设置起点
// path:给哪个路径设置起点
CGPathMoveToPoint(path, NULL, , ); // 添加一根线到某个点
CGPathAddLineToPoint(path, NULL, , ); // 3.把路径添加到上下文
CGContextAddPath(ctx, path); // 4.渲染上下文
CGContextStrokePath(ctx);

 方式2:(原生)

    // 获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 描述路径
// 设置起点
CGContextMoveToPoint(ctx, , ); CGContextAddLineToPoint(ctx, , ); // 渲染上下文
CGContextStrokePath(ctx);

 方式3:贝瑟尔路径

    // UIKit已经封装了一些绘图的功能
// 贝瑟尔路径
// 创建路径
UIBezierPath *path = [UIBezierPath bezierPath]; // 设置起点
[path moveToPoint:CGPointMake(, )]; // 添加一根线到某个点
[path addLineToPoint:CGPointMake(, )]; // 绘制路径
[path stroke];

3、线的相关操作

 原生

    // 获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 描述路径
//起点
CGContextMoveToPoint(ctx, , ); CGContextAddLineToPoint(ctx, , ); // 设置起点
CGContextMoveToPoint(ctx, , ); // 默认下一根线的起点就是上一根线终点
CGContextAddLineToPoint(ctx, , ); // 设置绘图状态,一定要在渲染之前
// 颜色
[[UIColor redColor] setStroke]; // 线宽
CGContextSetLineWidth(ctx, ); // 设置连接样式
CGContextSetLineJoin(ctx, kCGLineJoinBevel); // 设置顶角样式
CGContextSetLineCap(ctx, kCGLineCapRound); // 渲染上下文
CGContextStrokePath(ctx);

 贝瑟尔路径

    UIBezierPath *path = [UIBezierPath bezierPath];

    [path moveToPoint:CGPointMake(, )];

    [path addLineToPoint:CGPointMake(, )];

    // 线宽
path.lineWidth = ;
// 颜色
[[UIColor redColor] set]; [path stroke]; UIBezierPath *path1 = [UIBezierPath bezierPath]; [path1 moveToPoint:CGPointMake(, )]; [path1 addLineToPoint:CGPointMake(, )];
[[UIColor greenColor] set]; path1.lineWidth = ; [path1 stroke];

 比较:

  从代码中可以看出,原生的线操作只能将线绘制为一种样式,但是贝瑟尔路径的对线的操作可以根据路径的不同来绘制不同样式的线条

3、曲线

 方式1(原生)

    // 原生绘制方法
// 获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 描述路径
// 设置起点
CGContextMoveToPoint(ctx, , ); // CGContextAddQuadCurveToPoint(CGContextRef cg_nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)
// cpx:控制点的x
// cpy:控制点的y
// x, y 为线结束的点的坐标
CGContextAddQuadCurveToPoint(ctx, , , , ); // 渲染上下文
CGContextStrokePath(ctx);

 方式2(贝瑟尔路径)

    // 圆弧
// + (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
// Center:圆心
// radius:半径
// startAngle:开始角度
// endAngle:结束角度
// clockwise:YES:顺时针 NO:逆时针 CGPoint center = CGPointMake(, ); UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:M_PI_2 clockwise:YES]; [path stroke];

4、扇形

 未填充

    // 扇形
CGPoint center = CGPointMake(, );
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:M_PI_2 clockwise:YES]; // 添加一根线到圆心
[path addLineToPoint:center]; // 封闭路径,关闭路径:从路径的终点到起点
[path closePath]; [path stroke];

  代码效果图:

 填充

    // 扇形
CGPoint center = CGPointMake(, );
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:M_PI_2 clockwise:YES]; // 添加一根线到圆心
[path addLineToPoint:center]; // 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
[path fill];

  代码效果图:

5、圆角矩形

    // 圆角矩形
// + (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
// cornerRadius:圆角的弧度,当值为边长的一半时,画出来的图像为圆形
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(, , , ) cornerRadius:]; [path stroke]; // 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
// [path fill];

 代码效果图:

  

  相关操作同贝塞尔路径的相关操作类似,大家可以试试,对以上内容有什么建议的可以直接联系我,O(∩_∩)O谢谢!

【原】iOS学习之Quartz2D(1)的更多相关文章

  1. iOS学习笔记--Quartz2D

    Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统. Quartz 2D能完成的工作: 1. 绘制图形 : 线条\三角形\矩形\圆\弧等 2. 绘制文字 3. 绘制\生成图片(图像) 4 ...

  2. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

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

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

  4. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  5. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  6. 【原】iOS学习之第三方-AFNetworking1.3.0

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方 ...

  7. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  8. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  9. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

随机推荐

  1. jquery_DOM笔记4

    jQuery遍历函数: add()添加,可以是样式,字符串,元素,文本,js对象 andself() 指向匹配元素本身 chilidren() 匹配元素的所有子元素的匹配元素 closest() 从本 ...

  2. jsonp 实例

    一直以为很复杂吧?其实很简单,简单到你不敢相信 1.前端引好jquery文件 2.前端代码: $.ajax({       url: 'http://www.xxxxxxxx.com/expand.a ...

  3. tomcat 快速部署静态文件

    server.conf配置: <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software ...

  4. test1.xlsx

    耿丹CS16-2班第三次作业汇总 排名 学号后三位 姓名 作业顺序 作业情况 第三周博客 总得分 博客园地址 1 232 周* 1 8.5 3 12.5 http://www.cnblogs.com/ ...

  5. 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)

    这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...

  6. 安卓真机调试 出现Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE....

    [2016-08-20 14:38:39 - hybrid-android] Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE[2016-0 ...

  7. Centos7下安装mysql5.7.16

    mysql的安装(root用户下) 从官网下载软件 linux下必须安装系统对应的版本,多少位 必须安装的是:server,client 但是我可不管要安装那个插件,我们直接使用bundle版本(就是 ...

  8. JavaScript 字符串处理详解

    一.创建字符串       创建一个字符串,将一组字符串用引号包起来,将其赋值给一个字符串变量. var JsStr="Hello,JavaScript String!"; 二.字 ...

  9. Redis 慢速入门(一)

    网上关于redis的入门文章其实已经很多了,这里仅仅以作者特独的视角来学习下redis相关的基础概念. 一切的基础 需要分清楚3个重要的概念,key,type,value. 这里的key为hello, ...

  10. [Tool]使用ConfuserEx混淆代码

    为了防止程序发布后被一些"坏人"破解,开发者通常会对自己的代码进行混淆.这篇博客将介绍一款使用很广,并且混淆效果也不错的工具ConfuserEx. 新建一个C# 控制台程序,Hel ...