美文网首页iOS开发进阶iOS DeveloperGitHub 中文社区
iOS源码解读-Charts图表1:了解基类(ChartView

iOS源码解读-Charts图表1:了解基类(ChartView

作者: Gargit | 来源:发表于2017-03-07 17:14 被阅读832次

公司项目经常会有关于图表的需求,自己绘制的话工作量太大,并且可靠性也不强,于是,你懂的,GitHub大法好。

因为公司的应用也是iOS跟Android双版本的,为了两个版本的样式尽量相近,找到了下面这个库Charts(https://github.com/danielgindi/Charts),这个库是Daniel Cohen Gindi根据Android上面Philipp Jahoda的MPAndroidChart而来的,使用Swift编写,同时这也是GitHub上最受欢迎的iOS的图标库,由于项目需要定制一些需求,我也简单拜读了一下这个库的源码,主要是折线图跟雷达图(蜘蛛网图)部分的,尝试一下把自己看到的总结一下,如果有啥写得不对的地方,请各位看管斧正。

今天首先大概概述一下这个库几个基类。
ChartViewBase,ChartData,LegendRenderer,DataRenderer,ViewPortHandler,Animator,AxisBase,Description。

ChartViewBase

名字就能看出来,是图表视图的基类。有以下属性:

xAxis——x坐标轴;
_defaultValueFormatter——这是一个实现IValueFormatter协议的类,用来将数值进行格式化处理;
_data——持有未经过任何处理的原始数据的对象;
_highlightPerTapEnabled——点击时显示高亮的标志位,默认为true;
dragDecelerationEnabled——拖拽时允许减速的标志位,默认为true;
_dragDecelerationFrictionCoef——拖拽减速的摩擦系数,值为[0,1)区间内,值越大,减速越慢,当值为0时,减速会立即停止,1是非法的值,当设定该值大于等于1时,会自动把1转换成0.999,默认值为0.9;
chartDescription——存储一些图表描述的对象;
_legend——图例;
noDataText——当没有数据时,显示在图标中间的缺省文字,默认为“No chart data available.”;
noDataFont——没有数据时,提示文字的字体;
noDataTextColor——没有数据时,提示文字的颜色;
_legendRenderer——图例的渲染器;
renderer——数据的渲染器;
_viewPortHandler——管理图表的边界,并且绘制约束的对象;
_animator——响应动画的对象
_offsetsCalculated——记录是否已经计算好偏移值的标志位;
_indicesToHighlight——存高亮对象的数组(目前代码中其实好像就只会有一个元素);
drawMarkers——是否绘制标记(点击图标时,弹出来的浮标),默认值为true,(getter=isDrawMarkersEnabled);
marker——表示如何显示样式对象;
_interceptTouchEvents——是否拦截点击事件,默认为false;
extraTopOffset,extraRightOffset,extraBottomOffset,extraLeftOffset——上右下左的边距,默认为0;

再看看几个重要的方法

  • open func notifyDataSetChanged() 通知数据改变了,用以设置数据时,重新绘图,但在ChartViewBase中会抛出异常
  • internal func calculateOffsets() 计算上左下右偏移量,同样在基类中不做具体实现,并抛出异常
  • internal func calcMinMax() 计算y轴最大最小值,还有x轴跟y轴的范围;
  • internal func setupDefaultFormatter(min: Double, max: Double) 设置默认的格式化器
  • internal func drawDescription(context: CGContext) 绘制描述的方法;
  • open func highlightValue(x: Double, y: Double, dataSetIndex: Int, callDelegate: Bool) 处理高亮的值的方法;
  • open func getHighlightByTouchPoint(_ pt: CGPoint) -> Highlight? 从触摸点活动高亮对象;
  • internal func drawMarkers(context: CGContext) 绘制标记;
  • internal func drawMarkers(context: CGContext) 获取标记的位置;
  • open func getChartImage(transparent: Bool) -> NSUIImage? 当前图表转换成UIImage的对象;
  • open func save(to path: String, format: ImageFormat, compressionQuality: Double) -> Bool 把当前图标保存到本地。

AxisBase

无论x轴(XAxis)还是y轴(YAxis)都是继承于AxisBase,首先还是介绍属性

_axisValueFormatter——轴上坐标值的格式化类,是遵守IAxisValueFormatter协议的一个类;
labelFont——轴上坐标值字体;
labelTextColor——轴上坐标值颜色,默认为black;
axisLineColor——轴线的颜色,默认为gray;
axisLineWidth——轴线线宽,默认为0.5;
axisLineDashPhase——轴线虚线的相位;
axisLineDashLengths——轴线虚线的长度的数组,如[@10.0, @5.0],就是长为10的实线跟长为空白相隔的虚线;
gridColor——网格线的颜色;
gridLineWidth——网格线的线宽
gridLineDashPhase,gridLineDashLengths——意思跟轴线的一样;
gridLineCap——网格线帽(线的边沿)的形状,默认为CGLineCap.butt;
drawGridLinesEnabled——是否画网格线;
drawAxisLineEnabled——是否画轴线;
drawLabelsEnabled——是否话轴线上坐标值的标识;
_centerAxisLabelsEnabled——坐标值标签是否居中;
_limitLines——限制线的数组;
drawLimitLinesBehindDataEnabled——限制线绘制在数据后面还是前面,默认为false,即绘制在数据前面;
gridAntialiasEnabled——网格是否抗锯齿,默认打开;
entries——实际上数据条目的数组;
centeredEntries——轴线左边居中时使用的数据条目;
entryCount——数据的数目
_labelCount——坐标值显示的坐标的数目,默认为6;
decimals——要使用的小数位数,默认为0;
granularityEnabled——是否使用粒度(granularity)属性,如果设为true,轴坐标值通过granularity属性控制,如果设为false,当两个相邻的值四舍五入后相同的话,坐标值会重复。如果使用granularity属性可以避免显示过少的坐标值;
_granularity——见上一个属性,默认值为1.0;
forceLabelsEnabled——如果为true的时候,y坐标值数将会强制限制;

重要的方法有:

  • open func getFormattedLabel(_ index: Int) -> String 根据索引获取已格式化的字符串
  • open func calculate(min dataMin: Double, max dataMax: Double) 计算最大最小值并且y轴显示的范围。dataMin根据表格数据得到的y最小值,dataMax根据表格获得y的最大值。

相关文章

网友评论

    本文标题:iOS源码解读-Charts图表1:了解基类(ChartView

    本文链接:https://www.haomeiwen.com/subject/kdmygttx.html