。。。

首先了解一下CGContextRef:

An opaque type that represents a Quartz 2D drawing environment.

Graphics Context是图形上下文,可以将其理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,将画布放到我们的view中显示即可,view看作是一个画框.

自己学习时实现的demo,希望对大家有帮助,具体的实现看代码,并有完美的注释解释,还有一些对我帮助的博文供大家参考。都在代码里面。

看一下demo效果图先:

自定义CustomView类,CustomView.h:

  1. #import <UIKit/UIKit.h>
  2. #import <QuartzCore/QuartzCore.h>
  3. #define PI 3.14159265358979323846
  4. @interface CustomView : UIView
  5. @end

实现类CustomView.m:

  1. #import "CustomView.h"
  2. @implementation CustomView
  3. - (id)initWithFrame:(CGRect)frame
  4. {
  5. self = [super initWithFrame:frame];
  6. if (self) {
  7. }
  8. return self;
  9. }
  10. // 覆盖drawRect方法,你可以在此自定义绘画和动画
  11. - (void)drawRect:(CGRect)rect
  12. {
  13. //An opaque type that represents a Quartz 2D drawing environment.
  14. //一个不透明类型的Quartz 2D绘画环境,相当于一个画布,你可以在上面任意绘画
  15. CGContextRef context = UIGraphicsGetCurrentContext();
  16. /*写文字*/
  17. CGContextSetRGBFillColor (context,  1, 0, 0, 1.0);//设置填充颜色
  18. UIFont  *font = [UIFont boldSystemFontOfSize:15.0];//设置
  19. [@"画圆:" drawInRect:CGRectMake(10, 20, 80, 20) withFont:font];
  20. [@"画线及孤线:" drawInRect:CGRectMake(10, 80, 100, 20) withFont:font];
  21. [@"画矩形:" drawInRect:CGRectMake(10, 120, 80, 20) withFont:font];
  22. [@"画扇形和椭圆:" drawInRect:CGRectMake(10, 160, 110, 20) withFont:font];
  23. [@"画三角形:" drawInRect:CGRectMake(10, 220, 80, 20) withFont:font];
  24. [@"画圆角矩形:" drawInRect:CGRectMake(10, 260, 100, 20) withFont:font];
  25. [@"画贝塞尔曲线:" drawInRect:CGRectMake(10, 300, 100, 20) withFont:font];
  26. [@"图片:" drawInRect:CGRectMake(10, 340, 80, 20) withFont:font];
  27. /*画圆*/
  28. //边框圆
  29. CGContextSetRGBStrokeColor(context,1,1,1,1.0);//画笔线的颜色
  30. CGContextSetLineWidth(context, 1.0);//线的宽度
  31. //void CGContextAddArc(CGContextRef c,CGFloat x, CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle, int clockwise)1弧度=180°/π (≈57.3°) 度=弧度×180°/π 360°=360×π/180 =2π 弧度
  32. // x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
  33. CGContextAddArc(context, 100, 20, 15, 0, 2*PI, 0); //添加一个圆
  34. CGContextDrawPath(context, kCGPathStroke); //绘制路径
  35. //填充圆,无边框
  36. CGContextAddArc(context, 150, 30, 30, 0, 2*PI, 0); //添加一个圆
  37. CGContextDrawPath(context, kCGPathFill);//绘制填充
  38. //画大圆并填充颜
  39. UIColor*aColor = [UIColor colorWithRed:1 green:0.0 blue:0 alpha:1];
  40. CGContextSetFillColorWithColor(context, aColor.CGColor);//填充颜色
  41. CGContextSetLineWidth(context, 3.0);//线的宽度
  42. CGContextAddArc(context, 250, 40, 40, 0, 2*PI, 0); //添加一个圆
  43. //kCGPathFill填充非零绕数规则,kCGPathEOFill表示用奇偶规则,kCGPathStroke路径,kCGPathFillStroke路径填充,kCGPathEOFillStroke表示描线,不是填充
  44. CGContextDrawPath(context, kCGPathFillStroke); //绘制路径加填充
  45. /*画线及孤线*/
  46. //画线
  47. CGPoint aPoints[2];//坐标点
  48. aPoints[0] =CGPointMake(100, 80);//坐标1
  49. aPoints[1] =CGPointMake(130, 80);//坐标2
  50. //CGContextAddLines(CGContextRef c, const CGPoint points[],size_t count)
  51. //points[]坐标数组,和count大小
  52. CGContextAddLines(context, aPoints, 2);//添加线
  53. CGContextDrawPath(context, kCGPathStroke); //根据坐标绘制路径
  54. //画笑脸弧线
  55. //左
  56. CGContextSetRGBStrokeColor(context, 0, 0, 1, 1);//改变画笔颜色
  57. CGContextMoveToPoint(context, 140, 80);//开始坐标p1
  58. //CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1,CGFloat x2, CGFloat y2, CGFloat radius)
  59. //x1,y1跟p1形成一条线的坐标p2,x2,y2结束坐标跟p3形成一条线的p3,radius半径,注意, 需要算好半径的长度,
  60. CGContextAddArcToPoint(context, 148, 68, 156, 80, 10);
  61. CGContextStrokePath(context);//绘画路径
  62. //右
  63. CGContextMoveToPoint(context, 160, 80);//开始坐标p1
  64. //CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1,CGFloat x2, CGFloat y2, CGFloat radius)
  65. //x1,y1跟p1形成一条线的坐标p2,x2,y2结束坐标跟p3形成一条线的p3,radius半径,注意, 需要算好半径的长度,
  66. CGContextAddArcToPoint(context, 168, 68, 176, 80, 10);
  67. CGContextStrokePath(context);//绘画路径
  68. //右
  69. CGContextMoveToPoint(context, 150, 90);//开始坐标p1
  70. //CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1,CGFloat x2, CGFloat y2, CGFloat radius)
  71. //x1,y1跟p1形成一条线的坐标p2,x2,y2结束坐标跟p3形成一条线的p3,radius半径,注意, 需要算好半径的长度,
  72. CGContextAddArcToPoint(context, 158, 102, 166, 90, 10);
  73. CGContextStrokePath(context);//绘画路径
  74. //注,如果还是没弄明白怎么回事,请参考:http://donbe.blog.163.com/blog/static/138048021201052093633776/
  75. /*画矩形*/
  76. CGContextStrokeRect(context,CGRectMake(100, 120, 10, 10));//画方框
  77. CGContextFillRect(context,CGRectMake(120, 120, 10, 10));//填充框
  78. //矩形,并填弃颜色
  79. CGContextSetLineWidth(context, 2.0);//线的宽度
  80. aColor = [UIColor blueColor];//blue蓝色
  81. CGContextSetFillColorWithColor(context, aColor.CGColor);//填充颜色
  82. aColor = [UIColor yellowColor];
  83. CGContextSetStrokeColorWithColor(context, aColor.CGColor);//线框颜色
  84. CGContextAddRect(context,CGRectMake(140, 120, 60, 30));//画方框
  85. CGContextDrawPath(context, kCGPathFillStroke);//绘画路径
  86. //矩形,并填弃渐变颜色
  87. //关于颜色参考http://blog.sina.com.cn/s/blog_6ec3c9ce01015v3c.html
  88. //http://blog.csdn.net/reylen/article/details/8622932
  89. //第一种填充方式,第一种方式必须导入类库quartcore并#import <QuartzCore/QuartzCore.h>,这个就不属于在context上画,而是将层插入到view层上面。那么这里就设计到Quartz Core 图层编程了。
  90. CAGradientLayer *gradient1 = [CAGradientLayer layer];
  91. gradient1.frame = CGRectMake(240, 120, 60, 30);
  92. gradient1.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor,
  93. (id)[UIColor grayColor].CGColor,
  94. (id)[UIColor blackColor].CGColor,
  95. (id)[UIColor yellowColor].CGColor,
  96. (id)[UIColor blueColor].CGColor,
  97. (id)[UIColor redColor].CGColor,
  98. (id)[UIColor greenColor].CGColor,
  99. (id)[UIColor orangeColor].CGColor,
  100. (id)[UIColor brownColor].CGColor,nil];
  101. [self.layer insertSublayer:gradient1 atIndex:0];
  102. //第二种填充方式
  103. CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
  104. CGFloat colors[] =
  105. {
  106. 1,1,1, 1.00,
  107. 1,1,0, 1.00,
  108. 1,0,0, 1.00,
  109. 1,0,1, 1.00,
  110. 0,1,1, 1.00,
  111. 0,1,0, 1.00,
  112. 0,0,1, 1.00,
  113. 0,0,0, 1.00,
  114. };
  115. CGGradientRef gradient = CGGradientCreateWithColorComponents
  116. (rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));//形成梯形,渐变的效果
  117. CGColorSpaceRelease(rgb);
  118. //画线形成一个矩形
  119. //CGContextSaveGState与CGContextRestoreGState的作用
  120. /*
  121. CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆栈顶部的状态弹出,返回到之前的图形状态。这种推入和弹出的方式是回到之前图形状态的快速方法,避免逐个撤消所有的状态修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。
  122. */
  123. CGContextSaveGState(context);
  124. CGContextMoveToPoint(context, 220, 90);
  125. CGContextAddLineToPoint(context, 240, 90);
  126. CGContextAddLineToPoint(context, 240, 110);
  127. CGContextAddLineToPoint(context, 220, 110);
  128. CGContextClip(context);//context裁剪路径,后续操作的路径
  129. //CGContextDrawLinearGradient(CGContextRef context,CGGradientRef gradient, CGPoint startPoint, CGPoint endPoint,CGGradientDrawingOptions options)
  130. //gradient渐变颜色,startPoint开始渐变的起始位置,endPoint结束坐标,options开始坐标之前or开始之后开始渐变
  131. CGContextDrawLinearGradient(context, gradient,CGPointMake
  132. (220,90) ,CGPointMake(240,110),
  133. kCGGradientDrawsAfterEndLocation);
  134. CGContextRestoreGState(context);// 恢复到之前的context
  135. //再写一个看看效果
  136. CGContextSaveGState(context);
  137. CGContextMoveToPoint(context, 260, 90);
  138. CGContextAddLineToPoint(context, 280, 90);
  139. CGContextAddLineToPoint(context, 280, 100);
  140. CGContextAddLineToPoint(context, 260, 100);
  141. CGContextClip(context);//裁剪路径
  142. //说白了,开始坐标和结束坐标是控制渐变的方向和形状
  143. CGContextDrawLinearGradient(context, gradient,CGPointMake
  144. (260, 90) ,CGPointMake(260, 100),
  145. kCGGradientDrawsAfterEndLocation);
  146. CGContextRestoreGState(context);// 恢复到之前的context
  147. //下面再看一个颜色渐变的圆
  148. CGContextDrawRadialGradient(context, gradient, CGPointMake(300, 100), 0.0, CGPointMake(300, 100), 10, kCGGradientDrawsBeforeStartLocation);
  149. /*画扇形和椭圆*/
  150. //画扇形,也就画圆,只不过是设置角度的大小,形成一个扇形
  151. aColor = [UIColor colorWithRed:0 green:1 blue:1 alpha:1];
  152. CGContextSetFillColorWithColor(context, aColor.CGColor);//填充颜色
  153. //以10为半径围绕圆心画指定角度扇形
  154. CGContextMoveToPoint(context, 160, 180);
  155. CGContextAddArc(context, 160, 180, 30,  -60 * PI / 180, -120 * PI / 180, 1);
  156. CGContextClosePath(context);
  157. CGContextDrawPath(context, kCGPathFillStroke); //绘制路径
  158. //画椭圆
  159. CGContextAddEllipseInRect(context, CGRectMake(160, 180, 20, 8)); //椭圆
  160. CGContextDrawPath(context, kCGPathFillStroke);
  161. /*画三角形*/
  162. //只要三个点就行跟画一条线方式一样,把三点连接起来
  163. CGPoint sPoints[3];//坐标点
  164. sPoints[0] =CGPointMake(100, 220);//坐标1
  165. sPoints[1] =CGPointMake(130, 220);//坐标2
  166. sPoints[2] =CGPointMake(130, 160);//坐标3
  167. CGContextAddLines(context, sPoints, 3);//添加线
  168. CGContextClosePath(context);//封起来
  169. CGContextDrawPath(context, kCGPathFillStroke); //根据坐标绘制路径
  170. /*画圆角矩形*/
  171. float fw = 180;
  172. float fh = 280;
  173. CGContextMoveToPoint(context, fw, fh-20);  // 开始坐标右边开始
  174. CGContextAddArcToPoint(context, fw, fh, fw-20, fh, 10);  // 右下角角度
  175. CGContextAddArcToPoint(context, 120, fh, 120, fh-20, 10); // 左下角角度
  176. CGContextAddArcToPoint(context, 120, 250, fw-20, 250, 10); // 左上角
  177. CGContextAddArcToPoint(context, fw, 250, fw, fh-20, 10); // 右上角
  178. CGContextClosePath(context);
  179. CGContextDrawPath(context, kCGPathFillStroke); //根据坐标绘制路径
  180. /*画贝塞尔曲线*/
  181. //二次曲线
  182. CGContextMoveToPoint(context, 120, 300);//设置Path的起点
  183. CGContextAddQuadCurveToPoint(context,190, 310, 120, 390);//设置贝塞尔曲线的控制点坐标和终点坐标
  184. CGContextStrokePath(context);
  185. //三次曲线函数
  186. CGContextMoveToPoint(context, 200, 300);//设置Path的起点
  187. CGContextAddCurveToPoint(context,250, 280, 250, 400, 280, 300);//设置贝塞尔曲线的控制点坐标和控制点坐标终点坐标
  188. CGContextStrokePath(context);
  189. /*图片*/
  190. UIImage *image = [UIImage imageNamed:@"apple.jpg"];
  191. [image drawInRect:CGRectMake(60, 340, 20, 20)];//在坐标中画出图片
  192. //    [image drawAtPoint:CGPointMake(100, 340)];//保持图片大小在point点开始画图片,可以把注释去掉看看
  193. CGContextDrawImage(context, CGRectMake(100, 340, 20, 20), image.CGImage);//使用这个使图片上下颠倒了,参考http://blog.csdn.net/koupoo/article/details/8670024
  194. //    CGContextDrawTiledImage(context, CGRectMake(0, 0, 20, 20), image.CGImage);//平铺图
  195. }
  196. @end

用法:

  1. CustomView *customView = [[CustomView alloc]initWithFrame:CGRectMake(0, 0, 320, self.view.frame.size.height)];
  2. [self.view addSubview:customView];

ok,完成。

大家如果看过我的其它博客,会发现,这遍博客跟我的某一片博客很像,没错,就是http://blog.csdn.net/rhljiayou/article/details/7212620

当年写andriod的时候写的一遍博客。

原创地址!

http://blog.csdn.net/rhljiayou/article/details/9919713

IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)的更多相关文章

  1. (转) IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)

    首先了解一下CGContextRef: An opaque type that represents a Quartz 2D drawing environment. Graphics Context ...

  2. [置顶] IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)

    首先了解一下CGContextRef: An opaque type that represents a Quartz 2D drawing environment. Graphics Context ...

  3. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .

    1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...

  4. Android利用canvas画各种图形

    Android利用canvas画各种图形(点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形) 本文链接:https://blog.csdn.net/rhljiayou/article/det ...

  5. AJ学IOS(29)UI之Quartz2D自定义下载控件_画各种图形

    AJ分享,必须精品 效果 自定义控件过程 主要过程在上一篇里有介绍了,这里主要介绍下代码实现 先做好要放的view 然后实现呢主要就是四步: 1:获取上下文 2:拼接路径 3:把路径添加到上下文. 4 ...

  6. IOS开发之画图形

    1 画线 2 画线第二个方法  相对方法1简洁 3 矩形 4 圆 5 弧线 6画文字(略) 7 画图片(略)

  7. iOS 使用UIBezierPath和CAShapeLayer画各种图形

    CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你. 杂谈 在 CAShapeLayer 中,也可以像 CAL ...

  8. 使用Flex4画图形:圆、矩形、线

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  9. iOS-CGContextRef画各种图形例子

    iOS-CGContextRef画各种图形例子 绘制效果图 绘制代码 - (void)drawRect:(CGRect)rect { //一个不透明类型的Quartz 2D绘画环境,相当于一个画布,你 ...

随机推荐

  1. linq to xml 基本操作

    使用XDocument类来进行简单的xml操作,用于软件参数的设置保存. using System; using System.Collections.Generic; using System.Li ...

  2. Javascript 常用系统内置函数

    1:在数组指定位置插入元素 array.splice(2, 0, "three");   //在索引2的位置,删除0个元素后,插入元素“three” 例子: // 原来的数组 va ...

  3. Custom Sort Order

    When trying to sort based on values that do not fit the standard ascending and descending sort logic ...

  4. java android 访问DELPHI 的DATASNAP

    最新版的DELPHI开发DATASNAP非常简单便捷,DataSnap的REST风格和对JSON的支持,使之成为服务器端开发的神器. 一.DATASNAP服务器中的方法: TServerMethods ...

  5. Oracle表变化趋势追踪记录

    #DBA_HIST_SEG_STAT可以看出对象的使用趋势,构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数 select c.SNAP_I ...

  6. [terry笔记]RMAN综合学习之恢复

    [terry笔记]RMAN综合学习之备份http://www.cnblogs.com/kkterry/p/3308405.html [terry笔记]RMAN综合学习之恢复 http://www.cn ...

  7. python xml包使用记录

    <?xml version="1.0" encoding="utf-8" ?> <request> <functionID> ...

  8. 6.24AppCan移动开发者大会价值30万的展示机会归了谁?

    最近,小编的邮箱都被挤爆了! 来自开发者的邮件一封封涌进邮箱,VIP展位申请,TOP30 APP评选,感谢大家的积极参与,展位有限,APP名额有限,开发者的热情无限. 经过谨慎筛选.综合评定后,以下5 ...

  9. android开发系列之gradle认识

    后面的系列博客,我将会写一写自己这段时间对于android的学习.认识.体会,希望能够与大家分享. 相信大家从ADT开发切换到android studio最大.最直观的变化就是gradle,因为在an ...

  10. Android 上下文菜单实现

    1.覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法添加菜单项(MenuItem). 2.覆盖Activity的onContextItemSelecte ...