PNChart之源码分析及使用

PNChart is a simple and beautiful chart lib with animation.
支持LineChart(折线图),PieChart(饼图),BarChart(柱状图),CircleChart(环形图),RadarChart(雷达图),ScatterChart(散点图) 六种图表类型。

##源码分析
先看一下PNChart的类列表:
PNChart.png

很容易看出,除了PNBartChart和PNCircleChart,其他每种类型的图表都有自己对应的数据类,之所以BarChart和CircleChart没有数据类也是因为条形图和环形图表现的数据形式比较单一,只需要传入数据或者百分比即可根据横纵坐标绘制出完整的图表。

先看几个类:

  • PNChart:导入所有类的头文件,方便在使用的时候直接导入PNChart即可。
  • PNColor:使用宏定义了颜色值方便绘图时直接使用。
  • PNChartLabel:继承UILabel定义的一个简单Label。
  • PNChartDelegate:所有图表的点击事件回调代理都统一写在这里。
  • PNGenericChart:所有图表类的父类,负责图例是否显示以及样式等设置。每个子类都需要重写getLegendWithMaxWidth方法来返回各自的图例视图。

接下来我们以最常用的折线图为例,详细分析下源码:
相关的类有三个分别是:PNLineChart,PNLineChartData,PNLineChartDataItem。其中PNLineChartData和PNLineChartDataItem都是数据类,继承自NSObject,为什么需要两个数据类,因为PNLineChart支持同一张表里绘制多条折线,所以,PNLineChartData可以理解为每条折线的数据类,PNLineChartDataItem可以理解为每个点的数据类。

###PNLineChartDataItem
PNLineChartDataItem类的重要属性只有一个

1
@property (readonly) CGFloat y; // should be within the y range

通过类方法:

1
+ (PNLineChartDataItem *)dataItemWithY:(CGFloat)y;

即可创建点对象。

###PNLineChartData
每条线的颜色,透明度,节点数量,标题,是否显示节点标签,节点标签字体,节点标签颜色,节点标签格式,节点的样式,节点颜色,节点的宽度,折线的宽度这些属性可以在PNLineChartData对象来设置。

1
2
3
typedef PNLineChartDataItem *(^LCLineChartDataGetter)(NSUInteger item);

@property (copy) LCLineChartDataGetter getData;

在PNLineChartData中定义了一个获取节点数据的Block:LCLineChartDataGetter,它根据索引item,返回对应数据源的PNLineChartDataItem类对象。

###PNLineChart
PNLineChart这个类才是真正绘制图表类。strokeChart和updateChartData:方法是重要的绘制方法,他们会调用calculateChartPath:andPointsPath:andPathKeyPoints:andPathStartEndPoints: 去根据数据源具体的绘制每一条折线。

PNLineChart中还实现了对视图点击事件的处理,获取了用户接触的节点后,通过PNChartDelegate代理方法回调到控制器里去实现用户需要的操作。

##如何使用
如何使用在PNChart的git主页,作者已经给出用例了,这里就不赘述了。直接附上连接:PNChart

文章目录