当前位置: 首页 > news >正文

图形绘制-线段绘制相关

最近公司的项目要用到一些图表效果,本来也打算在github上找一些第三方。然而第三方的风格与公司的需求不尽相同,改动起来较麻烦。于是自己写了一个,并且通用化,现已共享至github上。https://github.com/China131/JHChart.git,如有帮组,记得star下哦,?

以下是自己的一些开发历程。

1.刚起手的时候,想完全用Quartz2D来绘制,然而Quartz2D只能绘制一些基本的图形,并不能达到路径绘制的动画效果。想要完全用UIBezierPath(UIBezierPath实际上也是使用OC语法将Quartz2D封装而成,使用更加方便)绘制,有觉得大材小用了,最终觉得使用Quartz2D绘制基本线条和文本描述,UIBezierPath曲线绘制路径动画过程。注意:Quartz2D是使用CPU渲染的,所以在频繁的绘图(比如在touch move方法里面实时更新图形)是会导致cpu的过高占有率,增加能耗和性能压力。

使用Quartz2D绘制时,建议直接在drawRect方法里面进行,这里面提供了一个图形绘制上下文,可以这样获取

  CGContextRef context = UIGraphicsGetCurrentContext();

  //    移动到点

   CGContextMoveToPoint(context, start.x, start.y);

//从当前上下文点连接到点

  CGContextAddLineToPoint(context, end.x, end.y);

  /*        路径颜色         */

    [color setStroke];

    

    /*        路径闭合区域的填充颜色         */

    [color setFill];

 

//设置线段的虚线样式

   CGFloat ss[] = {0.5,2,1};

//解释下如下方法参数:第一个参数是上下文 第二个参数表示距离线段多少的像素点开始绘制虚线 ,第三个表示虚线的绘制规律数组,如上面的ss数组,表示第一段0.5个像素长度为实线,紧接着2个像素的虚线,再接着1个像素的实线。第四个参数表示如果第三个参数传入数组,则执行绘制的虚线规律数组到第几个。如传入2,表示绘制规律为数组中的前两个元素。

       CGContextSetLineDash(context, 0, ss, 2);

在此强调一点:CGContextSetLineDash中的数组应当使用CGFloat(虽然使用其他类型可能不会报错,但是有可能会导致程序崩溃),不要使用float或者double类型数组,因为在iPhone5s及以下,机型为32位操作系统,以上则为64为操作系统,因此,如果使用了float 或者double类型,在iPhone5s及以下会造成程序崩溃,如下为系统对CGFloat的定义。

#if defined(__LP64__) && __LP64__

# define CGFLOAT_TYPE double

# define CGFLOAT_IS_DOUBLE 1

# define CGFLOAT_MIN DBL_MIN

# define CGFLOAT_MAX DBL_MAX

#else

# define CGFLOAT_TYPE float

# define CGFLOAT_IS_DOUBLE 0

# define CGFLOAT_MIN FLT_MIN

# define CGFLOAT_MAX FLT_MAX

#endif

转载于:https://www.cnblogs.com/ToBeTheOne/p/5458703.html

相关文章:

  • wget 命令用法详解
  • 介绍一个基于jQuery的Cookie操作插件
  • 并查集的应用
  • 37条常用Linux Shell命令组合
  • 运维小技巧:使用ss命令代替 netstat,和netstat说再见
  • 弹出框插件——dialog
  • 小强的HTML5移动开发之路(21)—— PhoneGap
  • dba基础课程-linux操作系统:系统信息命令
  • 定位被选中的select
  • 创新团队中常见的几种“怪人”
  • div/iframe自适应浏览器宽度高度问题
  • Linux下PHP支持oracle,安装oracle instant client,pdo_oci笔记
  • EBS JSP文件编译命令
  • git revert和reset区别
  • Yii防注入攻击笔记
  • 分享的文章《人生如棋》
  • Android交互
  • AWS实战 - 利用IAM对S3做访问控制
  • javascript数组去重/查找/插入/删除
  • Rancher-k8s加速安装文档
  • VuePress 静态网站生成
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云Kubernetes容器服务上体验Knative
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 如何解决微信端直接跳WAP端
  • 入门级的git使用指北
  • 微信小程序实战练习(仿五洲到家微信版)
  • 在Unity中实现一个简单的消息管理器
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # Apache SeaTunnel 究竟是什么?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (8)STL算法之替换
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十五)使用Nexus创建Maven私服
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net 代码性能 - (1)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 简单实现MD5
  • .NET 设计模式初探
  • .Net 知识杂记
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /etc/shadow字段详解