1. 導入框架
-
通過 cocoapods 管理應用程序時,在 Podfile 文件中,use_frameworks! 的使用區別如下:
-
使用 use_frameworks! 時 dynamic frameworks 方式 -> .framework
cocoapods 會生成對應的 frameworks 文件
在 Link Binary With Libraries:會生成 Pods_工程名.framework,包含了其它用 cocoapods 導入的第三方框架的 .framework 文件 -
不使用 use_frameworks! 時 static libraries 方式 -> 生成.a文件
cocoapods 會生成相應的 .a文件(靜態鏈接庫)
Link Binary With Libraries: libPods-工程名.a 包含了其他用 cocoapods 導入有第三庫的 .a 文件
-
-
通過 cocoapods 導入 swift 庫時,都必須使用 use_frameworks!
use_frameworks! pod 'Charts' pod 'ChartsRealm'
-
終端執行 pod install 完成框架集成
2. Xcode配置
-
導入框架之后 command + B 編譯報如下錯誤:提示Swift 版本不兼容
-
解決方式: Pods -> TARGETS 選擇對應的庫文件 -> Build Settings -> Swift Compiler - Language 修改對應 swift 版本, Charts、ChartsRealm、RealmSwift 都需要設置
-
當外部 Framework 在編譯時需開啟 Defines Module,如果沒有開啟且沒有 Framework 源碼的情況無需設置。
3. 創建視圖及配置
-
使用框架時,demo先行,選擇需要的折線圖類型進而研究並使用
這里介紹主要使用的幾個庫類,僅供參考!
-
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
屬性 描述 _axisValueFormatter 軸上坐標值的格式化類,遵守IAxisValueFormatter協議的一個類 labelFont 坐標軸數值字體 labelTextColor 坐標軸數值字體顏色 axisLineColor 軸線顏色,默認為gray axisLineWidth 軸線線寬,默認為0.5 axisLineDashPhase 軸線虛線的相位 axisLineDashLengths 軸線為虛線的長度數組,如@[@4.f, @2.f],則為長為4的實線和長為2的虛線空白間隔 gridColor 網格線顏色 gridLineWidth 網格線線寬 gridLineCap 網格線邊緣形狀 drawGridLinesEnabled 是否繪制網格線 drawAxisLineEnabled 是否繪制軸線 drawLabelsEnabled 是否顯示坐標軸數值 _centerAxisLabelsEnabled 坐標值標簽是否居中 _limitLines 限制線的數組 drawLimitLinesBehindDataEnabled 限制線繪制在數據后面還是前面,默認為false,即繪制在數據前面 gridAntialiasEnabled 網格是否抗鋸齒 _labelCount 坐標軸顯示數值的數目,默認為6 decimals 要使用的小數位數,默認為0 granularityEnabled 如果為true,則軸標簽由 granularity
屬性控制,如果為false,則可能會重復軸值,如果兩個相鄰的軸值取整為相同的值,則可能會發生這種情況,如果使用粒度,可以通過減少可見的軸值來避免。forceLabelsEnabled 如果為true的時候,y坐標值數將會強制限制 重要方法 描述 open func getFormattedLabel(_ index: Int) -> String 根據索引獲取已格式化的字符串 open func calculate(min dataMin: Double, max dataMax: Double) 計算最大最小值並且y軸顯示的范圍。dataMin根據表格數據得到的y最小值,dataMax根據表格獲得y的最大值 -
LineChartDataSet 子類 - 折線的設置
屬性 描述 axisDependency 設置數據依賴的軸 - (左/右) lineWidth 線寬,默認為1 drawValuesEnabled 是否繪制線上文字 highlightEnabled 選中拐點,是否開啟高亮效果(顯示十字線) highlightColor 點擊選中拐點的十字線的顏色 highlightLineDashLengths 十字線的虛實長度數組 highlightLineWidth 十字線寬度 drawCirclesEnabled 是否繪制拐點 circleRadius 拐點半徑 circleColors 拐點顏色 drawCircleHoleEnabled 是否繪制拐點的空心 circleHoleRadius 拐點空心半徑 circleHoleColor 拐點空心的顏色
4. 部分注意點
-
自定義 X 軸,Y 軸,折線上數據
- x軸,y軸的數據自定義需要遵守協議:IChartAxisValueFormatter
- 折線上的數據自定義需要遵守協議:IChartValueFormatter
- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis { return [NSString stringWithFormat:@"%.f月",value]; }
5. 部分源碼修改
-
修改十字線虛線樣式 ( LineScatterCandleRadarRenderer.swift )
@objc open func drawHighlightLines(context: CGContext, point: CGPoint, set: ILineScatterCandleRadarChartDataSet) { // draw vertical highlight lines if set.isVerticalHighlightIndicatorEnabled { context.beginPath() // 文修2019年08月15日17:55:58 // context.move(to: CGPoint(x: point.x, y: viewPortHandler.contentTop)) // context.addLine(to: CGPoint(x: point.x, y: viewPortHandler.contentBottom)) context.move(to: CGPoint(x: point.x, y: viewPortHandler.contentBottom)) context.addLine(to: CGPoint(x: point.x, y: point.y)) context.strokePath() } // draw horizontal highlight lines if set.isHorizontalHighlightIndicatorEnabled { context.beginPath() // 文修2019年08月15日17:55:58 // context.move(to: CGPoint(x: viewPortHandler.contentLeft, y: point.y)) // context.addLine(to: CGPoint(x: viewPortHandler.contentRight, y: point.y)) context.move(to: CGPoint(x: viewPortHandler.contentLeft, y: point.y)) context.addLine(to: CGPoint(x: point.x, y: point.y)) context.strokePath() } }