转自:http://www.maxiaoguo.com/clothes/252.html

基本图形的绘制 包括: 代码画线,画文字 图片 裁剪 重绘  简单动画

当自定义view的时候 系统会自动调用drawRect 方法

画线

- (void)drawRect:(CGRect)rect
{// Drawing code// 1.获得图形上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.拼接图形(路径)// 设置线段宽度CGContextSetLineWidth(ctx, 10);// 设置线段头尾部的样式CGContextSetLineCap(ctx, kCGLineCapRound);// 设置线段转折点的样式CGContextSetLineJoin(ctx, kCGLineJoinRound);/**  第1根线段  **/// 设置颜色CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);// 设置一个起点CGContextMoveToPoint(ctx, 10, 10);// 添加一条线段到(100, 100)CGContextAddLineToPoint(ctx, 100, 100);// 渲染一次CGContextStrokePath(ctx);/**  第2根线段  **/// 设置颜色CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);// 设置一个起点CGContextMoveToPoint(ctx, 200, 190);// 添加一条线段到(150, 40)CGContextAddLineToPoint(ctx, 150, 40);CGContextAddLineToPoint(ctx, 120, 60);// 3.渲染显示到view上面CGContextStrokePath(ctx);
}

画圆弧

/***  画圆弧*/
void drawArc()
{// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画圆弧// x\y : 圆心// radius : 半径// startAngle : 开始角度// endAngle : 结束角度// clockwise : 圆弧的伸展方向(0:顺时针, 1:逆时针)CGContextAddArc(ctx, 100, 100, 50, M_PI_2, M_PI, 0);// 3.显示所绘制的东西CGContextFillPath(ctx);
}

画圆

/***  画圆*/
void drawCircle()
{// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画圆CGContextAddEllipseInRect(ctx, CGRectMake(50, 10, 100, 100));CGContextSetLineWidth(ctx, 10);// 3.显示所绘制的东西CGContextStrokePath(ctx);
}

画矩形

/***  画四边形*/
void draw4Rect()
{// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画矩形CGContextAddRect(ctx, CGRectMake(10, 10, 150, 100));// set : 同时设置为实心和空心颜色// setStroke : 设置空心颜色// setFill : 设置实心颜色[[UIColor whiteColor] set];//    CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);// 3.绘制图形CGContextFillPath(ctx);
}

画三角形

/***  画三角形*/
void drawTriangle()
{// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画三角形CGContextMoveToPoint(ctx, 0, 0);CGContextAddLineToPoint(ctx, 100, 100);CGContextAddLineToPoint(ctx, 150, 80);// 关闭路径(连接起点和最后一个点)CGContextClosePath(ctx);//CGContextSetRGBStrokeColor(ctx, 0, 1, 0, 1);// 3.绘制图形CGContextStrokePath(ctx);
}

画文字

/***  画文字*/
void drawText()
{// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画矩形CGRect cubeRect = CGRectMake(50, 50, 100, 100);CGContextAddRect(ctx, cubeRect);// 3.显示所绘制的东西CGContextFillPath(ctx);// 4.画文字NSString *str = @"哈哈哈哈Good morning hello hi hi hi hi";//    [str drawAtPoint:CGPointZero withAttributes:nil];NSMutableDictionary *attrs = [NSMutableDictionary dictionary];// NSForegroundColorAttributeName : 文字颜色// NSFontAttributeName : 字体attrs[NSForegroundColorAttributeName] = [UIColor redColor];attrs[NSFontAttributeName] = [UIFont systemFontOfSize:50];[str drawInRect:cubeRect withAttributes:attrs];
}

画图片

void drawImage()
{// 1.取得图片UIImage *image = [UIImage imageNamed:@"me"];// 2.画
//    [image drawAtPoint:CGPointMake(50, 50)];
//    [image drawInRect:CGRectMake(0, 0, 150, 150)];[image drawAsPatternInRect:CGRectMake(0, 0, 200, 200)];// 3.画文字NSString *str = @"为xxx所画";[str drawInRect:CGRectMake(0, 180, 100, 30) withAttributes:nil];
}

在绘制的时候 当设置了ctx 的颜色的时候 再绘制其他的图时,颜色需要重置,很麻烦,解决方法是重置 ctx 如下

 // 将ctx拷贝一份放到栈中CGContextSaveGState(ctx);// 设置绘图状态CGContextSetLineWidth(ctx, 10);[[UIColor redColor] set];CGContextSetLineCap(ctx, kCGLineCapRound);// 第1根线CGContextMoveToPoint(ctx, 50, 50);CGContextAddLineToPoint(ctx, 120, 190);CGContextStrokePath(ctx);// 将栈顶的上下文出栈,替换当前的上下文CGContextRestoreGState(ctx);

整个ctx 的旋转 移动

    CGContextRotateCTM(ctx, M_PI_4 * 0.3);CGContextScaleCTM(ctx, 0.5, 0.5);CGContextTranslateCTM(ctx, 0, 150);

图片的裁剪 思路是 裁剪ctx的显示区域

- (void)drawRect:(CGRect)rect
{CGContextRef ctx = UIGraphicsGetCurrentContext();CGContextSaveGState(ctx);// 0.画圆CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 50, 50));// 裁剪CGContextClip(ctx);CGContextFillPath(ctx);// 1.显示图片UIImage *image = [UIImage imageNamed:@"me"];[image drawAtPoint:CGPointMake(100, 100)];CGContextRestoreGState(ctx);CGContextAddRect(ctx, CGRectMake(0, 0, 50, 50));CGContextFillPath(ctx);
}

动画

CADisplayLink 是一个定时器,特点 刷新频率高,  setNeedsDisplay方法起重新绘制的作用

- (void)awakeFromNib
{CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];//    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];
}- (void)drawRect:(CGRect)rect
{self.snowY+=5;if (self.snowY >= rect.size.height) {self.snowY = -100;}UIImage *image = [UIImage imageNamed:@"snow.jpg"];[image drawAtPoint:CGPointMake(0, self.snowY)];
}

通过路径画图

- (void)drawRect:(CGRect)rect
{CGContextRef ctx = UIGraphicsGetCurrentContext();// 1.先创建一个路径CGMutablePathRef linePath = CGPathCreateMutable();// 2.拼接路径CGPathMoveToPoint(linePath, NULL, 0, 0);CGPathAddLineToPoint(linePath, NULL, 100, 100);// 3.添加路径到上下文CGContextAddPath(ctx, linePath);CGMutablePathRef circlePath = CGPathCreateMutable();CGPathAddArc(circlePath, NULL, 150, 150, 50, 0, M_PI * 2, 0);CGContextAddPath(ctx, circlePath);// 4.渲染CGContextStrokePath(ctx);CGPathRelease(linePath);CGPathRelease(circlePath);CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();CGColorSpaceRelease(cs);//    CFRelease(linePath);
//    CFRelease(circlePath);
//    CFRelease(cs);
}

ios 基本图形的绘制相关推荐

  1. 深入理解Flutter的图形图像绘制原理——图形库skia剖析

    Flutter是目前流行的高性能跨平台UI框架,图形库skia是其跨平台的基石.本文将深入分析skia的图形.字体.图片的渲染原理,如何挖掘硬件特性,为UI性能优化提供思路. 1. 引言 Flutte ...

  2. 手机直播系统开发中关于iOS获取图形验证码功能

    在手机直播系统开发中关于iOS获取图形验证码功能介绍,首先进入注册页面后请求图形验证码接口获取图形验证码的数字组合,然后加载到相应的页面上,在图形验证码页面我们定义了几个属性,字符串的数量.显示的线条 ...

  3. OpenCv Java 简单的图形轮廓绘制 (5)

    初学Opencv实现一点点的功能都感觉很是吃力,所以不得不写点东西记忆一下,不然明天又忘记了 好记星不如烂笔头 我就想能不能处分出图片中的正方形和圆形,标记出来,我们这边就绘制器图像,下一步就是认识图 ...

  4. 【MATLAB】基本绘图 ( 绘制多图 | 设置图形对话框在 Windows 界面的位置和大小 | 在一个图形上绘制多个小图形 )

    文章目录 一.绘制多图 1.绘制多图 2.代码示例 二.设置图形对话框在 Windows 界面的位置和大小 三.在一个图形上绘制多个小图形 一.绘制多图 1.绘制多图 存在一种绘图情况 , 需要同时展 ...

  5. 基于matlab的能级_波函数及几率密度图形的绘制,基于MATLAB的能级波函数及几率密度图形的绘制.pdf...

    基于MATLAB的能级波函数及几率密度图形的绘制.pdf 第 卷 第 期 大 学 物 理 实 验 年 月 出版 壬 刃协 卫 印 文 章编 号 一 ' 一 一 基 于 的能级 . 波 函数 及 几 率 ...

  6. IOS开发基础之绘制饼图、柱状图、自定义进度条

    IOS开发基础之绘制饼图.柱状图.自定义进度条 源码在我的主页里 1.绘制饼图 效果 源码 // LJView.m // 34-绘图饼图 // Created by 鲁军 on 2021/2/23. ...

  7. 箱线图和散点图叠加图形的绘制——R language

    前几日偶然从科学网上看到了一副特别漂亮的统计图形,如下图(摘自博文:http://blog.sciencenet.cn/blog-397960-456174.html)所示: 感觉美翻了都,刚好在学习 ...

  8. tilemap 菱形_使用Cocos creator制作【治愈七夕】-音乐游戏图形api绘制跳舞的线

    专栏概述及目录:笑苍天Smile:专栏概述及目录​zhuanlan.zhihu.com 游戏截图: 游戏地址:微信扫一扫 游戏源码 游戏技术:前端引擎-Cocos creator,语言-Ts. 写作目 ...

  9. java绘制图形_java绘制基本图形.doc

    java绘制基本图形 java绘制基本图形 1. * *** ***** 2. * * * ***** 3. ************* * * * * ************* 4. ****** ...

最新文章

  1. 干货丨8种用Python实现线性回归的方法
  2. 20145202、20145225、20145234 《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验...
  3. 计算机故障检修课过时,第三场公开课|电脑故障维修以及笔记本知识科普
  4. 使用java实现rfc3161,openssl验证用自签名证书签名的RFC3161时间戳
  5. 数仓是如何与“夏令时”愉快的玩耍?
  6. boost::serialization 用基类指针转存派生类(错误多多,一波三折)
  7. 【鱼眼镜头8】张正友畸变公式;鱼眼的畸变公式需要使用入射角
  8. python qq红包_numpy的Python,发红包,用
  9. Docker 清理数据卷 volumes
  10. oss文件服务器是什么,对象存储oss是什么
  11. android实现记事本app
  12. 找不到移动硬盘解决办法
  13. 如何打开和修改CAJ格式的文档?
  14. Matlab中imag函数用法
  15. 利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止。
  16. SSD1963芯片引脚分布及其功能
  17. 成功通过PMP考试---我的经验
  18. 人工神经网络(ANN)
  19. 2021牛客多校二(补题)
  20. Go语言实现原理——锁实现原理

热门文章

  1. 关于matlab的mod问题
  2. 微信小程序 自定义组件并引入
  3. 十年测试两茫茫,不思量,自难忘!
  4. 史上最全阿里 Java 面试题总结
  5. SpringBoot下MySQL的读写分离
  6. 程序员必备十大学习网站,你真的都了解吗?
  7. GitHub开源推荐 | 炫酷的Material风格Qt控件
  8. 如何快速编写代码及注意点 - 学习/总结
  9. 康耐视visionpro定位引导标定简介及方法
  10. zuul整合nacos_zuul使用nacos作为服务中心