前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用。例如:point,line,Arc(圆弧),Curves(曲线),Ellipse(椭圆),矩形(Rectangle).

对这些path可以进行stroke(描边),也可以进行fill(填充).也可以利用path对一个区域进行截取(clip).

例如,使用截取圆形区域 


如果对Quartz的基本概念仍然不清楚的,强烈建议看下我之前的这篇文章,不然不能理解

iOS 2D绘图详解(Quartz 2D)之概述


Points/Lines

Quartz中,使用方法CGContextMoveToPoint移动画笔到一个点来开始新的子路径,使用CGContextAddLineToPoint来从当前开始点添加一条线到结束点,注意,CGContextAddLineToPoint调用后,开始点会重新设置,这知道结束点

举个例子 
 
代码

- (void)drawRect:(CGRect)rect {CGContextRef context = UIGraphicsGetCurrentContext(); //获得当前context//设置颜色CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);//为了颜色更好区分,对矩形描边CGContextFillRect(context, rect);CGContextStrokeRect(context, rect);//实际line和point的代码CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);// 设置描边颜色CGContextSetLineWidth(context, 4.0);//线的宽度CGContextSetLineCap(context, kCGLineCapRound);//线的顶端CGContextSetLineJoin(context, kCGLineJoinRound);//线相交的模式CGContextMoveToPoint(context,10,10);CGContextAddLineToPoint(context, 40, 40);CGContextAddLineToPoint(context, 10, 80);CGContextStrokePath(context);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这里提一下线的顶端模式,使用CGContextSetLineCap来设置,一共有三种

线的相交模式,使用CGContextSetLineJoin 来设置,一共也有三种 
 

虚线 
效果 
 
代码

    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);CGContextSetLineWidth(context, 1.0);CGContextSetLineCap(context, kCGLineCapRound);CGContextSetLineJoin(context, kCGLineJoinRound);CGFloat lengths[] = {2};CGContextSetLineDash(context, 1, lengths, 1);CGContextMoveToPoint(context,10,10);CGContextAddLineToPoint(context, 40, 40);CGContextAddLineToPoint(context, 10, 80);CGContextStrokePath(context);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

使用到方法CGContextSetLineDash参数详解

void CGContextSetLineDash (CGContextRef _Nullable c,CGFloat phase,const CGFloat * _Nullable lengths,size_t count
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • c 绘制的context,这个不用多说
  • phase,第一个虚线段从哪里开始,例如传入3,则从第三个单位开始
  • lengths,一个C数组,表示绘制部分和空白部分的分配。例如传入[2,2],则绘制2个单位,然后空白两个单位,以此重复
  • count lengths的数量

圆弧

Quartz提供了两个方法来绘制圆弧

  • CGContextAddArc,普通的圆弧一部分(以某圆心,某半径,某弧度的圆弧)
  • CGContextAddArcToPoint,用来绘制圆角,下文会详细阐述

CGContextAddArc参数

void CGContextAddArc (CGContextRef _Nullable c,CGFloat x,CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle,int clockwise
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • c,context不用剁手
  • x,y指定坐标原点
  • radius,指定半径长度
  • startAngle/endAngle,指定某一段弧度
  • clockwise,1表示顺时针,0表示逆时针 
    例如 
    这个函数很简单,不放图了
  CGContextAddArc(context,50,50, 25,M_PI_2,M_PI,1);CGContextStrokePath(context);
  • 1
  • 2
  • 1
  • 2

CGContextAddArcToPoint这个方法比较复杂,但是理解了也没那么难 
函数体

void CGContextAddArcToPoint (CGContextRef _Nullable c,CGFloat x1,CGFloat y1,CGFloat x2,CGFloat y2,CGFloat radius
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参数

  • c context
  • x1,y1和当前点(x0,y0)决定了第一条切线(x0,y0)->(x1,y1)
  • x2,y2和(x1,y1)决定了第二条切线
  • radius,想切的半径。

也就是说, 
绘制一个半径为radius的圆弧,和上述 两条直线都相切。

代码

    CGContextMoveToPoint(context, 100, 50);CGContextAddArcToPoint(context,100,0,50,0, 50);CGContextStrokePath(context);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

效果 

解释为什么 
 
图中的两条红线就是上文提到的两条线,分别是(x0,y0)->(x1,y1)和(x1,y1)->(x2,y2),那么和这两条线都想切的自然就是图中的蓝色圆弧了


椭圆/矩形

比较简单,这里不多赘述

示例

    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);CGContextAddEllipseInRect(context, CGRectMake(10, 10,40, 20));CGContextAddRect(context, CGRectMake(10, 10,40, 20));CGContextStrokePath(context);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

效果 


曲线

Quartz 使用计算机图形学中的多项式来绘制曲线,支持二次和三次曲线。 
利用函数CGContextAddCurveToPoint可以绘制三次曲线, 
函数体

void CGContextAddCurveToPoint (CGContextRef _Nullable c,CGFloat cp1x,CGFloat cp1y,CGFloat cp2x,CGFloat cp2y,CGFloat x,CGFloat y
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参数

  • c context
  • cp1x,cp1y 第一个控制点
  • cp2x,cp2y 第二个控制点
  • x,y 结束点 
    具体效果如图 

使用方法CGContextAddQuadCurveToPoint 来绘二次曲线, 
函数体,

void CGContextAddQuadCurveToPoint (CGContextRef _Nullable c,CGFloat cpx,CGFloat cpy,CGFloat x,CGFloat y
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参数

  • c context
  • cpx,cpy控制点
  • x,y结束点
  • 效果

iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)相关推荐

  1. iOS 2D绘图详解(Quartz 2D)之概述

    原创Blog,转载请注明出处  http://blog.csdn.net/hello_hwc?viewmode=list 前言:最近在研究自定义控件,由于想要彻底的定制控件的视图还是要继承UIView ...

  2. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  3. Python Matplotlib 3D绘图详解(汇总)

    Python Matplotlib 3D绘图详解(汇总) 最初开发的 Matplotlib,仅支持绘制 2d 图形,后来随着版本的不断更新, Matplotlib 在二维绘图的基础上,构建了一部分较为 ...

  4. python turtle循环图案-Python内置模块turtle绘图详解

    urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...

  5. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  6. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  7. Python Turtle 海龟绘图详解官方文档中文版

    Python Turtle 海龟绘图详解 (官方文档中文版)-安徽省太湖中学陈晓中整理 概述 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour Pape ...

  8. 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)

    如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...

  9. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

最新文章

  1. 操作系统内存管理_操作系统6内存管理基础
  2. 仅需少量视频观看记录,就可以精准推断你的习惯
  3. 请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。
  4. 无限式查找-----2013年2月28日
  5. lvs+keeplive
  6. 用c语言制作简易的个人通讯录管理系统
  7. 微信小程序-敏感内容检测 文本过滤 图片检测
  8. POJ 6184 【三元环 +分治】
  9. 《东周列国志》第八十一回 美人计吴宫宠西施 言语科子贡说列国
  10. 【报告分享】2021小红书美护趋势品牌报告-小红书聚美丽(附下载)
  11. matlab Logistic回归模型
  12. 中国移动手机话费查询号码1008611
  13. 手把手教你搭建深度学习环境
  14. argmax与max的区别
  15. ffmpeg断流黑屏问题分析
  16. 网络营销实战课-笔记4
  17. CCFCSP 202006-4 1246
  18. 安卓开发fragment报错_Android应用开发之嵌套Fragments (Nested Fragments) 的使用及常见错误讲解...
  19. matlab/simulink仿真-电池补偿低频充放电+超级电容补偿高频充放电
  20. Unity使用Shader实现3D模型外描边效果

热门文章

  1. mSystems:干旱对土壤微生物组的影响
  2. R语言一键批量完成差异统计和可视化
  3. Nat Rev Genet发表房刚组细菌表观组综述论文
  4. python将scikit-learn自带数据集转换为pandas dataframe格式
  5. R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串、str_replace_all函数替换所有匹配到的
  6. Pandas将dataframe保存为pickle文件并加载保存后的pickle文件查看dataframe数据实战
  7. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置、添加箱图、位置参数调整)实战
  8. R语言可视化包ggplot2绘制排序条形图实战:按照分类因子排序、按照数值排序
  9. 线性模型系数解读中的那些坑,以套索回归(LASSO)和岭回归(Ridege)为例
  10. 酸奶饮料新产品口味测试研究案例