iOS源碼解讀-Charts圖表1:了解基類(ChartViewBase、AxisBase)

公司項目經常會有關于圖表的需求,自己繪制的話工作量太大,并且可靠性也不強,于是,你懂的,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的最大值。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容