iOS Charts 折線圖框架的基本使用


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()
        }
    }
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM