天天看点

用CorePlot实现类似Air Quality的柱状图滚动效果(1/2)

也是最近1个月在项目中不断研究coreplot实现柱状图的效果。

先来看一下air quality的柱状图效果:

用CorePlot实现类似Air Quality的柱状图滚动效果(1/2)

经过1个月的研究,现在基本上已经重现了这个柱状图的功能(99%),而且还加上了刷新数据的功能。

计划通过两篇blog来记录下开发中的难点,在后一篇blog中会把所有的源码挂上去。

难点有以下几个:

1. coreplot自带的滚动机制在我这边做起来有一些卡顿,用户体验很不好,这里需要替换掉它自带的滚动功能

2. 不用coreplot的滚动以后,需要新建一个view用于承载左侧固定的坐标轴

3. 滚动是高亮的柱子的选择以及设置高亮标签

4. 顶端时间的显示

5. 数据刷新功能

如果不清楚如何用swift添加coreplot,参见我之前的这篇blog:http://blog.csdn.net/u011156012/article/details/44061411

本篇blog首先讲解下前两个问题。进入正题:

先上一下storyboard的构建:

用CorePlot实现类似Air Quality的柱状图滚动效果(1/2)
用CorePlot实现类似Air Quality的柱状图滚动效果(1/2)

二级页模块bg是一个背景的imageview;label就是中间上部的标题label;line1px是美工切出来的1个px的分割线,放在label下面;然后scrollview用来承载我们的coreplot,可以看到里面还是放了一个我们的graph hosting view;最后的view是用来承载左侧的坐标系。

接下来看如何在scrollview中搭建hosting view

这里我用一个函数initplotgraphview来把所有的代码写进去,因为这部分代码确实有点长。

我基本上加上了足够多的注释。有一些特别重要的部分单独拿出来强调以下。

正常情况下,我们的graphview的长度肯定会大于scrollview的长度的,因为数据足够多的话,这个长度一定是够的;当然一定会出现特殊的情况,比如我们不断向左边划屏,刷新历史的数据,总会遇到历史数据刷新过来只有几条或者十几条的情况,这样整个scrollview的contentsize的width就会太小,而导致scrollview不能滑动了,所以这里面如果graphview的width小于屏幕的宽度,就要把它+1,这样确保scrollview中的数目不多的情况下依旧可以滑屏。

这里补充以下前提:因为coreplot的数据是画上去的,在我们不适用它自带的滑屏效果后,我们需要把所有的柱子都画到scrollview里面,这样会占用不小的内存,实际测试中,画上600个柱子大概要消耗20m左右的内存,所以我们要采用滚动刷新的机制,确保每个scrollview中的柱子数目不能太多。项目中我使用的阈值是120个。

接下来设置bar plot

这里其实把每个柱子的边线宽度设置成了0.1,因为开始设置成0了以后,或者把thebarplot.linestyle  =nil ,会有一种情况,就是我们传回来的数据是0.x,就是大于0但是小于1时,柱子会不显示出来,所以这把边界设置成0.1可以保证当传进来的数字大于0小于1时也能够显示出来一个很小的线。

这里关于plotspace的x和y range我弄成了1:1的关系,就是把所有的内容都显示出来,在注释里面也些了,如果要使plotspace滚动的话,xrange的长度应该是1/4或者1/8,意思就是分几个屏幕来显示所有的数据。

接下来绘制x轴和y轴

关于自定义的x轴label的显示我们放到下一个blog去介绍,这里面先暂时不多介绍。

这样整个initplotgraphview就完成了,当然函数的最后选中特定的bar以及高亮的offset的用法我们都在下一个blog中介绍。

接下来显示左侧的纵轴的刻度是个很简单的函数,因为我们在之前把y轴设定了消失的动作,所以这里面的y轴其实就是我们手动设置上去的几个label

这里面把传进来的最大值做相关的计算并且显示在label上。

基本上前两个难点就解决了。基本上我们已经搭建好了大的框架,下来的工作就是具体解决一些细节的东西,这里我们放到下一篇blog中详细讲解。