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

公司項(xiàng)目經(jīng)常會(huì)有關(guān)于圖表的需求,自己繪制的話工作量太大,并且可靠性也不強(qiáng),于是,你懂的,GitHub大法好。

因?yàn)楣镜膽?yīng)用也是iOS跟Android雙版本的,為了兩個(gè)版本的樣式盡量相近,找到了下面這個(gè)庫Charts(https://github.com/danielgindi/Charts),這個(gè)庫是Daniel Cohen Gindi根據(jù)Android上面Philipp Jahoda的MPAndroidChart而來的,使用Swift編寫,同時(shí)這也是GitHub上最受歡迎的iOS的圖標(biāo)庫,由于項(xiàng)目需要定制一些需求,我也簡(jiǎn)單拜讀了一下這個(gè)庫的源碼,主要是折線圖跟雷達(dá)圖(蜘蛛網(wǎng)圖)部分的,嘗試一下把自己看到的總結(jié)一下,如果有啥寫得不對(duì)的地方,請(qǐng)各位看管斧正。

今天首先大概概述一下這個(gè)庫幾個(gè)基類。
ChartViewBase,ChartData,LegendRenderer,DataRenderer,ViewPortHandler,Animator,AxisBase,Description。

ChartViewBase

名字就能看出來,是圖表視圖的基類。有以下屬性:

xAxis——x坐標(biāo)軸;
_defaultValueFormatter——這是一個(gè)實(shí)現(xiàn)IValueFormatter協(xié)議的類,用來將數(shù)值進(jìn)行格式化處理;
_data——持有未經(jīng)過任何處理的原始數(shù)據(jù)的對(duì)象;
_highlightPerTapEnabled——點(diǎn)擊時(shí)顯示高亮的標(biāo)志位,默認(rèn)為true;
dragDecelerationEnabled——拖拽時(shí)允許減速的標(biāo)志位,默認(rèn)為true;
_dragDecelerationFrictionCoef——拖拽減速的摩擦系數(shù),值為[0,1)區(qū)間內(nèi),值越大,減速越慢,當(dāng)值為0時(shí),減速會(huì)立即停止,1是非法的值,當(dāng)設(shè)定該值大于等于1時(shí),會(huì)自動(dòng)把1轉(zhuǎn)換成0.999,默認(rèn)值為0.9;
chartDescription——存儲(chǔ)一些圖表描述的對(duì)象;
_legend——圖例;
noDataText——當(dāng)沒有數(shù)據(jù)時(shí),顯示在圖標(biāo)中間的缺省文字,默認(rèn)為“No chart data available.”;
noDataFont——沒有數(shù)據(jù)時(shí),提示文字的字體;
noDataTextColor——沒有數(shù)據(jù)時(shí),提示文字的顏色;
_legendRenderer——圖例的渲染器;
renderer——數(shù)據(jù)的渲染器;
_viewPortHandler——管理圖表的邊界,并且繪制約束的對(duì)象;
_animator——響應(yīng)動(dòng)畫的對(duì)象
_offsetsCalculated——記錄是否已經(jīng)計(jì)算好偏移值的標(biāo)志位;
_indicesToHighlight——存高亮對(duì)象的數(shù)組(目前代碼中其實(shí)好像就只會(huì)有一個(gè)元素);
drawMarkers——是否繪制標(biāo)記(點(diǎn)擊圖標(biāo)時(shí),彈出來的浮標(biāo)),默認(rèn)值為true,(getter=isDrawMarkersEnabled);
marker——表示如何顯示樣式對(duì)象;
_interceptTouchEvents——是否攔截點(diǎn)擊事件,默認(rèn)為false;
extraTopOffset,extraRightOffset,extraBottomOffset,extraLeftOffset——上右下左的邊距,默認(rèn)為0;

再看看幾個(gè)重要的方法

  • open func notifyDataSetChanged() 通知數(shù)據(jù)改變了,用以設(shè)置數(shù)據(jù)時(shí),重新繪圖,但在ChartViewBase中會(huì)拋出異常
  • internal func calculateOffsets() 計(jì)算上左下右偏移量,同樣在基類中不做具體實(shí)現(xiàn),并拋出異常
  • internal func calcMinMax() 計(jì)算y軸最大最小值,還有x軸跟y軸的范圍;
  • internal func setupDefaultFormatter(min: Double, max: Double) 設(shè)置默認(rèn)的格式化器
  • internal func drawDescription(context: CGContext) 繪制描述的方法;
  • open func highlightValue(x: Double, y: Double, dataSetIndex: Int, callDelegate: Bool) 處理高亮的值的方法;
  • open func getHighlightByTouchPoint(_ pt: CGPoint) -> Highlight? 從觸摸點(diǎn)活動(dòng)高亮對(duì)象;
  • internal func drawMarkers(context: CGContext) 繪制標(biāo)記;
  • internal func drawMarkers(context: CGContext) 獲取標(biāo)記的位置;
  • open func getChartImage(transparent: Bool) -> NSUIImage? 當(dāng)前圖表轉(zhuǎn)換成UIImage的對(duì)象;
  • open func save(to path: String, format: ImageFormat, compressionQuality: Double) -> Bool 把當(dāng)前圖標(biāo)保存到本地。

AxisBase

無論x軸(XAxis)還是y軸(YAxis)都是繼承于AxisBase,首先還是介紹屬性

_axisValueFormatter——軸上坐標(biāo)值的格式化類,是遵守IAxisValueFormatter協(xié)議的一個(gè)類;
labelFont——軸上坐標(biāo)值字體;
labelTextColor——軸上坐標(biāo)值顏色,默認(rèn)為black;
axisLineColor——軸線的顏色,默認(rèn)為gray;
axisLineWidth——軸線線寬,默認(rèn)為0.5;
axisLineDashPhase——軸線虛線的相位;
axisLineDashLengths——軸線虛線的長(zhǎng)度的數(shù)組,如[@10.0, @5.0],就是長(zhǎng)為10的實(shí)線跟長(zhǎng)為空白相隔的虛線;
gridColor——網(wǎng)格線的顏色;
gridLineWidth——網(wǎng)格線的線寬
gridLineDashPhase,gridLineDashLengths——意思跟軸線的一樣;
gridLineCap——網(wǎng)格線帽(線的邊沿)的形狀,默認(rèn)為CGLineCap.butt;
drawGridLinesEnabled——是否畫網(wǎng)格線;
drawAxisLineEnabled——是否畫軸線;
drawLabelsEnabled——是否話軸線上坐標(biāo)值的標(biāo)識(shí);
_centerAxisLabelsEnabled——坐標(biāo)值標(biāo)簽是否居中;
_limitLines——限制線的數(shù)組;
drawLimitLinesBehindDataEnabled——限制線繪制在數(shù)據(jù)后面還是前面,默認(rèn)為false,即繪制在數(shù)據(jù)前面;
gridAntialiasEnabled——網(wǎng)格是否抗鋸齒,默認(rèn)打開;
entries——實(shí)際上數(shù)據(jù)條目的數(shù)組;
centeredEntries——軸線左邊居中時(shí)使用的數(shù)據(jù)條目;
entryCount——數(shù)據(jù)的數(shù)目
_labelCount——坐標(biāo)值顯示的坐標(biāo)的數(shù)目,默認(rèn)為6;
decimals——要使用的小數(shù)位數(shù),默認(rèn)為0;
granularityEnabled——是否使用粒度(granularity)屬性,如果設(shè)為true,軸坐標(biāo)值通過granularity屬性控制,如果設(shè)為false,當(dāng)兩個(gè)相鄰的值四舍五入后相同的話,坐標(biāo)值會(huì)重復(fù)。如果使用granularity屬性可以避免顯示過少的坐標(biāo)值;
_granularity——見上一個(gè)屬性,默認(rèn)值為1.0;
forceLabelsEnabled——如果為true的時(shí)候,y坐標(biāo)值數(shù)將會(huì)強(qiáng)制限制;

重要的方法有:

  • open func getFormattedLabel(_ index: Int) -> String 根據(jù)索引獲取已格式化的字符串
  • open func calculate(min dataMin: Double, max dataMax: Double) 計(jì)算最大最小值并且y軸顯示的范圍。dataMin根據(jù)表格數(shù)據(jù)得到的y最小值,dataMax根據(jù)表格獲得y的最大值。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容