什么是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开头 CoreGraphicsCGContextRef ctx = UIGraphicsGetCurrentContext();// 2.描述路径// 创建路径CGMutablePathRef path = CGPathCreateMutable();// 设置起点// path:给哪个路径设置起点CGPathMoveToPoint(path, NULL, 0, 250);// 添加一根线到某个点CGPathAddLineToPoint(path, NULL, 250, 0);// 3.把路径添加到上下文
    CGContextAddPath(ctx, path);// 4.渲染上下文CGContextStrokePath(ctx);

 方式2:(原生)

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

 方式3:贝瑟尔路径

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

3、线的相关操作

 原生

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

 贝瑟尔路径

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

 比较:

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

3、曲线

 方式1(原生)

    // 原生绘制方法// 获取上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 描述路径// 设置起点CGContextMoveToPoint(ctx, 150, 50);// CGContextAddQuadCurveToPoint(CGContextRef cg_nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)// cpx:控制点的x// cpy:控制点的y// x, y 为线结束的点的坐标CGContextAddQuadCurveToPoint(ctx, 50, 50, 50, 150);// 渲染上下文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(125, 125);UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];[path stroke];

4、扇形

 未填充

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

  代码效果图:

 填充

    // 扇形CGPoint center = CGPointMake(125, 125);UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:100 startAngle:0 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(20, 20, 200, 200) cornerRadius:50];[path stroke];// 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
//    [path fill];

 代码效果图:

  

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

转载于:https://www.cnblogs.com/gfxxbk/p/6023304.html

【原】iOS学习之Quartz2D(1)相关推荐

  1. iOS学习笔记--Quartz2D

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

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

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

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

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

  4. ios学习 准备列表

    2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...

  5. iOS学习:调用相机,选择图片上传,带预览功能

    iOS学习:调用相机,选择图片上传,带预览功能 发表于2年前(2013-05-30 21:38)   阅读( 18194) | 评论( 16) 27人收藏此文章,我要收藏 赞3 8月22日珠海 OSC ...

  6. iOS -- 学习资料总结(转载)

    先著名转载地址:https://www.jianshu.com/p/c47c24ab1e76/ 关于iOS学习进阶的必读一些博客总结 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱, ...

  7. 关于iOS学习进阶的必读一些博客总结

    关于iOS学习进阶的必读一些博客总结 作者 Raybon_lee 2016.01.16 22:28* 字数 3110 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱,但是后期会慢慢增 ...

  8. c语言分支和循环总结,C语言 ---- 循环分支 iOS学习-----细碎知识点总结

    #import   // #import是OC种的导入头文件或者是系统框架的指令 // 定义了一个Season枚举类型 enum Season { Spring = 1, // 值默认是从0开始,后面 ...

  9. iOS学习——核心动画之Layer基础

    iOS学习--核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

最新文章

  1. mac的mysql数据库管理_Mac使用MySQL Workbench管理MySQL数据库
  2. 编程心法 之什么是MVP What is MVP development?
  3. OOCSS——概念篇
  4. Android Studio 版本号详解
  5. np.identity()
  6. 虚拟机ubuntu安装ssh服务器,经过Xshell远程链接虚拟机VMVARE中的Ubuntu
  7. postgresql对于HashJoin算法的Data skew优化与MCV处理
  8. 高斯课堂数电讲义笔记_学技树
  9. 重磅 | Windows 10内部版本及核心源代码泄露,一共32TB
  10. Class字节码文件结构总结
  11. JProfiler12 最新使用教程
  12. 一步步教你破解WIFI无线WEP网络密钥
  13. 最好的6个Go语言Web框架
  14. 《SEM长尾搜索营销策略解密》一一2.1 起因:核心词成本过高
  15. 无80端口情况下使用 CertBot 申请SSL证书 并实现自动续期
  16. android 获取设备ID(DeviceID)
  17. 让Linux内核不再卡死在DHCP请求上
  18. 强大便携的多标签文件管理器 XYplorer Pro 21.60 中文版
  19. 解决帆软中不能制作城市热力图的问题
  20. n子棋,你能下赢电脑吗,来玩玩吧

热门文章

  1. sql中的begin....end
  2. 四川大学计算机学院夏欣,自适应窗口的图像平滑去噪.pdf
  3. 修改oracle+sga+size,oracle自动内存共享管理测试。修改 oracle 11g SGA_MAX_SIZE。
  4. php a标签 执行js,关于a标签不能调用js方法的小细节,你注意到了么?
  5. 信号与系统 2022 春季学期第一次作业-作业题目准备
  6. 设立『自动驾驶虚拟仿真赛道』
  7. 电机贴上锡纸到底有没有作用?
  8. Arduino基本人机接口:点阵LED、汉字库、键盘
  9. 2021年春季学期-信号与系统-第十三次作业参考答案-第七小题
  10. 有的人撑死,有的人饿死,有的人吓死