热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【iOS开发80】Quartz2D画图简单介绍:直线/圆形/椭圆/方形以及上下文栈管理CGContextSaveGState/CGContextRestoreGState

-(void)drawRect:(CGRect)rect{获得当前上下文CGContextRefctxUIGraphicsGetCurrentContext();把当前上下文状态保

技术分享

技术分享


- (void)drawRect:(CGRect)rect {
    //获得当前上下文
    CGContextRef ctx=UIGraphicsGetCurrentContext();
    
    //把当前上下文状态保存在栈中
    CGContextSaveGState(ctx);
    
    //缩放、移动处理(须要放在画图之前进行设置)
    CGContextScaleCTM(ctx, 0.5, 0.5);
    CGContextTranslateCTM(ctx, 100, 100);
    CGContextRotateCTM(ctx, M_PI_4);
    
    //描点
    CGContextMoveToPoint(ctx, 10, 10);
    CGContextAddLineToPoint(ctx, 100, 100);
    CGContextAddLineToPoint(ctx, 150, 50);
    //下面两种方式均可闭环
    //CGContextAddLineToPoint(ctx, 10, 10);
    CGContextClosePath(ctx);
    //渲染画图,实心和空心
    CGContextStrokePath(ctx);
    //CGContextFillPath(ctx);
    
    //把当前上下文状态保存在栈中
    CGContextSaveGState(ctx);
    
    //画正方形
    CGContextAddRect(ctx, CGRectMake(100, 100, 50, 50));
    //设置线宽(一定要在CGContextStrokePath之前)
    //由于之前有过一次渲染画图,所以这个属性设置不影响上面的那个三角形,下面颜色设置同理
    //所以,假设想分别设置两个或多个图形的属性,就分别渲染画图一次
    CGContextSetLineWidth(ctx, 10);
    //设置颜色(同理。属性设置的代码都要在画图的代码之前)
    CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);
    CGContextStrokePath(ctx);
    
    //设置样式
    CGContextMoveToPoint(ctx, 20, 160);
    CGContextAddLineToPoint(ctx, 200, 280);
    CGContextAddLineToPoint(ctx, 250, 200);
    CGContextSetLineWidth(ctx, 20);
    //设置头尾样式
    CGContextSetLineCap(ctx, kCGLineCapRound);
    //设置转角样式
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    CGContextStrokePath(ctx);
    
    //把保存在栈中的上下文状态取出来,恢复。

上面那段代码设置的样式不会影响其它 CGContextRestoreGState(ctx); //画椭圆 CGContextAddEllipseInRect(ctx, CGRectMake(200, 130, 60, 30)); //下面等价 //CGContextStrokePath(ctx); CGContextDrawPath(ctx, kCGPathStroke); //画圆形 CGContextAddEllipseInRect(ctx, CGRectMake(140, 170, 50, 50)); CGContextSetLineWidth(ctx, 3); CGContextStrokePath(ctx); //画圆弧 CGContextAddArc(ctx, 200, 50, 50, M_PI_4, M_PI, 1); CGContextStrokePath(ctx); //画1/4圆,以及颜色的设置新方法 CGContextMoveToPoint(ctx, 10, 230); CGContextAddLineToPoint(ctx, 10, 280); CGContextAddLineToPoint(ctx, 60, 280); CGContextAddArc(ctx, 10, 280, 50, 0, -M_PI_2, 1); [[UIColor greenColor] setStroke]; CGContextStrokePath(ctx); //画图片和文字(不须要手动取得上下文) NSString *str1=@"辛丑年一空作"; [str1 drawAtPoint:CGPointZero withAttributes:nil]; UIImage *img=[UIImage imageNamed:@"001"]; [img drawAtPoint:CGPointMake(10, 10)]; //在一个框框里重叠图片并署名 CGRect rect1=CGRectMake(50, 50, 100, 100); [img drawAsPatternInRect:rect1]; NSMutableDictionary *attr=[[NSMutableDictionary alloc]init]; attr[NSForegroundColorAttributeName]=[UIColor whiteColor]; attr[NSFontAttributeName]=[UIFont systemFontOfSize:13]; [str1 drawInRect:CGRectMake(50, 140, 100, 100) withAttributes:attr]; //把保存在栈中的上下文状态取出来,恢复。上面那段代码设置的样式不会影响其它 CGContextRestoreGState(ctx); //裁剪圆形头像 CGContextAddEllipseInRect(ctx, CGRectMake(150, 150, 100 , 100)); //依照圆形剪裁出一个上下文区域,以后的内容就填充在这个圆形上下文中 CGContextClip(ctx); UIImage *img1=[UIImage imageNamed:@"me"]; [img1 drawAtPoint:CGPointMake(150, 150)]; }



【iOS开发-80】Quartz2D画图简单介绍:直线/圆形/椭圆/方形以及上下文栈管理CGContextSaveGState/CGContextRestoreGState


推荐阅读
  • SQL Server 存储过程实践任务(第二部分)
    本文档详细介绍了三个SQL Server存储过程的创建与使用方法,包括统计特定类型客房的入住人数、根据房间号查询客房详情以及删除特定类型的客房记录。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • 本文详细探讨了在Windows 98环境下安装Apache 1.3.9、JServ、GNUJSP 1.0、JDK 1.2.2及JSDK 2.0后遇到的中文显示问题,并提供了多种有效的解决方案。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 解决Pytesser模块在Windows环境下出现的错误
    本文详细探讨了如何解决在Windows环境中使用Pytesser模块进行OCR(光学字符识别)时遇到的WindowsError错误,提供了具体的解决方案。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
author-avatar
佳品h空投
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有