折线图这个东西在我这家公司之前很少触及,因为我之前很讨厌贝塞尔曲线,虽然简历上写着熟悉贝塞尔曲线,会用它做各种图。但是只有我自己知道这说的纯属瞎话,每次遇到需要画特殊的图形的时候无百度不成图!
下一篇我将通过写的两个小demo继续来讲讲柱状图,以及折线图
当前这家公司接手的第一个项目,是要做一款天气项目,类似于墨迹天气当然,功能上没有那么复杂先简单上一下主界面图
这里需要用到柱状图,和折线图来展示数据
前面还有很多利用贝塞尔曲线画出的很多不规则图形
之前没有接触过类似的项目,所以自然而然的项目里选择了使用第三方框架PNChart、ZFChart
PNChart是一款非常流行的主流Chart,适用于折线图,柱状图,饼状图,我这里折线图用的它,柱状图用的ZFChart,原因是 PNChart在柱状图方面有一点BUG,这点在github上面也有人提交了issue给作者,相信很快能得到解决。
简单聊一下PNChart的实现及封装理念,这里我是用CocoaPod导入的
从它的驼峰命名来看,基本可以清楚每一个类大致是做什么用的Pie是饼状图
这里的chart都是继承至 PNGenericChart
来看一下这个基类里做了哪些操作,在这里声明了所有Chart共有的属性,两个结构体分别是chart的方向与风格(串行和堆叠)字体大小及颜色等属性
简单说一下他的封装理念,以折线图为例,虽然光折线图就有一千多行代码看着让人头皮发麻,但仔细琢磨下作者的手法你会感觉到 握草!还能这样封装!
先来看一下里面有哪些方法,作者对他们进行了分类这有就一目了然
初始化方法就不必再说,先看看坐标轴是怎么画出来的
就这么些代码,承载折线图的坐标系就出来了,这只是雏形,先新建一个上下文,接着在设置线条的属性,接着就是x轴和y轴的起始点了再进行连线,当然别忘了画小贱头
看一下坐标轴上的分段点是怎么画出来的,其实没有多么复杂
只要你稍微有点基础就能看明白,唯一麻烦的可能就是计算位置了
接下来就是画出x轴上和y轴上的label这些东西都比较简单,找准位置就行,简单说一下他的封装理念,然后通过我自己写的一些demo来谈谈我的理解
我们知道折线图是从一点到另一点的,这里动画可能看不清,他是从左到右画线的动画,作者是先将每一个坐标点计算出来,利用for 循环坐标点的个数,在每一次的循环里 将第一个坐标点A作为起始点 “from”下一个B作为终点"to"再利用数学公式计算出两点间距离,当然每次的循环里都有
CGRect circleRect = CGRectMake(x - inflexionWidth / 2, y - inflexionWidth / 2, inflexionWidth, inflexionWidth);
CGPoint circleCenter = CGPointMake(circleRect.origin.x + (circleRect.size.width / 2), circleRect.origin.y + (circleRect.size.height / 2));
//画坐标点小圆圈
[pointPath moveToPoint:CGPointMake(circleCenter.x + (inflexionWidth / 2), circleCenter.y)];
[pointPath addArcWithCenter:circleCenter radius:inflexionWidth / 2 startAngle:0 endAngle:2 * M_PI clockwise:YES];
这里是画上每个点的小圆环
然后通过
将两个点之间的路径作为字典存放在数组中,然后将B作为起始点,下一个C作为终点重复以上
然后再取出每个点连上线,这里由于项目需要,我改动了一些加了一些判断条件如果当前点没有数据就断掉,
作者封装的很不错,我暂时也只能理解一部分,懂个大概,知道怎么去用怎么去修改,不过一般这种自定义很高的东西最好还是自己学会怎么去自己写出来,毕竟别人的有很大的局限性,下一篇我自己封装了一个简单的chart