iOS Charts框架集成及使用

最近公司項目中要加一個折線圖的需求因為是金融項目考慮到后期可能會有大量的餅狀和折線圖的需求,仔細搜索一番覺得用個成熟的charts框架會比較好,最終決定用Charts,話不多說把自己踩過的坑放上來自己也做個筆記。

Charts? ?github地址:https://github.com/danielgindi/Charts

折線圖:


Charts集成

導入charst框架,創建橋接文件

因為我的項目是oc編寫,Charts是swift編寫,首先得創建橋接文件

1、用的cocoapods客戶端,直接上手導入charts框架

2、創建oc與swift橋接文件

任意創建一個swift的類點擊finish,再點擊Create Bridging Header,然后會發現項目中有了XXX-Bridging-Header類,在此類中引入頭文件@import Charts。最后在Build Settings中將Swift Language Version選為4.0,為了后面我們的氣泡使用。




Charts使用

1、ViewController導入頭文件,導入Delegate<IChartAxisValueFormatter,IChartValueFormatter>

2、創建折線圖

- (void)initLineChartView{

????//創建折線圖

????_linechartView =? [[LineChartViewalloc]init];

????_linechartView.frame = CGRectMake(10, 60, ScreenWidth - 20, 260);

????_linechartView.legend.form = ChartLegendFormNone; ? //說明圖標 ? ? ????_linechartView.dragEnabled = NO;? ? ? //拖動手勢 ? ? ????_linechartView.pinchZoomEnabled = NO;? ? ? //捏合手勢 ? ? ????_linechartView.rightAxis.enabled = NO;? ? ? //隱藏右Y軸 ? ? ????_linechartView.chartDescription.enabled = NO;? ? ? //不顯示描述label ? ? ????_linechartView.doubleTapToZoomEnabled = NO;? ? ? //禁止雙擊縮放? ????_linechartView.drawGridBackgroundEnabled = NO; ? ? ????_linechartView.drawBordersEnabled? ? ? ? = NO; ?

????? _linechartView.dragEnabled ? ? ? ? ? ? ? = YES; ? ? //拖動氣泡

? ? [_linechartView animateWithXAxisDuration:2.20 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? easingOption:ChartEasingOptionEaseOutBack];? ?//加載動畫時長

? [self.view addSubview:_linechartView];

}

3、y軸,x軸

- (void)initLineChartViewWithLeftaxisMaxValue:(double)maxValue MinValue:(double)minValue{

????//氣泡

????BalloonMarker*marker = [[BalloonMarkeralloc]initWithColor:[UIColororangeColor]font: [UIFontsystemFontOfSize:10]textColor:UIColor.whiteColorinsets:UIEdgeInsetsMake(9.0,8.0,20.0,8.0)];

????marker.bubbleImg =? [UIImageimageNamed:@"chartqipaoBubble"];

????marker.chartView = _linechartView;

????marker.minimumSize = CGSizeMake(50.f,25.f);

????_linechartView.marker = marker;

????//設置左Y軸

????ChartYAxis*leftAxis = _linechartView.leftAxis;[leftAxisremoveAllLimitLines];

????leftAxis.axisMaxValue =? maxValue; ????//設置Y軸的最大值

????leftAxis.axisMinValue = 0.00;????//設置Y軸的最小值

????leftAxis.axisLineWidth = 1;

????leftAxis.labelCount=5; ????//y軸展示多少個

????labelleftAxis.labelFont = [UIFontsystemFontOfSize:12];

????leftAxis.labelTextColor = [UIColorlightGrayColor];

????leftAxis.axisLineColor = [UIColorlightGrayColor];????//左Y軸線條顏色

????leftAxis.gridColor = [UIColorlightGrayColor];

????leftAxis.zeroLineColor = [UIColorlightGrayColor];????//左Y軸底線條顏色

????leftAxis.drawZeroLineEnabled = YES;

????leftAxis.drawLimitLinesBehindDataEnabled = YES;

????// 設置X軸

????ChartXAxis*xAxis =_linechartView.xAxis;

????xAxis.axisLineColor = [UIColorlightGrayColor];

????xAxis.labelPosition =? XAxisLabelPositionBottom;

????xAxis.labelFont = [UIFontsystemFontOfSize:12];

????xAxis.labelTextColor = [UIColorlightGrayColor];

????xAxis.axisMinValue = -0.3; ????// label間距

????xAxis.granularity = 1.0;

????xAxis.drawAxisLineEnabled = NO;????//是否畫x軸線

????xAxis.drawGridLinesEnabled = NO;????//是否畫網格

}

4、數據

- (void)initLineChartDataWithXvalueArr:(NSArray*)xValueArr YvlueArr:(NSArray*)yValueArr{

????_xValueArr = xValueArr;????// 設置x軸折線數據 (模擬數據)

????_yValueArr = yValueArr;????// 設置y軸折線數據 (模擬數據)

????_chart_YmaxValue = [[_yValueArrvalueForKeyPath:@"@max.doubleValue"]doubleValue];????//最大值

????_chart_YminValue = [[_yValueArrvalueForKeyPath:@"@min.doubleValue"]doubleValue];? ? ?//最小值

????if(_chart_YmaxValue<0.03&& (_chart_YminValue==_chart_YmaxValue)){

????????_scale = 10;

????}else if(_chart_YminValue==_chart_YmaxValue){

????????_scale = 2;

????}else{

????????_scale = 1;

}

????[selfinitLineChartViewWithLeftaxisMaxValue:_chart_YmaxValueMinValue:_chart_YminValue]; //引入

????//chartView設置X軸數據(日期)

????if(_xValueArr.count>0) {

????_linechartView.xAxis.axisMaxValue = (double)xValueArr.count-1+0.3;

????_linechartView.xAxis.valueFormatter =? [[ChartIndexAxisValueFormatteralloc]initWithValues:xValueArr];

}

? ? // 創建數據集數組

????NSMutableArray*dataSets = [[NSMutableArrayalloc]init];

????LineChartDataSet*set = [selfdrawLineWithArr:yValueArrtitle:nilcolor:[UIColororangeColor]];

????if(set) {

????????[dataSetsaddObject:set];????// 賦值數據集數組

????}

????LineChartData*data = [[LineChartDataalloc]initWithDataSets:dataSets];

????_linechartView.data = data;

}

5、delegate調用,IChartValueFormatter delegate,根據數據數組 title color 創建折線set

- (LineChartDataSet *)drawLineWithArr:(NSArray *)arr title:(NSString *)title color:(UIColor *)color { ??

? ? ? if (arr.count == 0) { ? ? ? ?

????????return nil; ? ?

????} ? ?

????// 處理折線數據?

????NSMutableArray *statistics = [NSMutableArray array]; ?

????double leftAxisMin = 0; ? ?

????double leftAxisMax = 0; ? ?

????for (int i = 0; i < arr.count; i++) { ?? ?

? ? ? ? ? ?NSString *num = arr[i]; ? ? ? ?

? ? ? ? ? ?double temp ? = [num doubleValue];? ? ?

? ? ? ?????double value? = [self roundFloat:temp];? ? ? ??

? ? ? ?????leftAxisMax ? = MAX(value, leftAxisMax); ? ? ?

? ? ? ?????leftAxisMin ? = MIN(value, leftAxisMin); ? ? ?

? ? ? ? ? ?[statistics addObject:[[ChartDataEntry alloc] initWithX:i y:value]]; ?

????? } ?? ? ?? ? ? ?

????CGFloat topNum = leftAxisMax * (5.0/4.0); ??

?????if (leftAxisMax ==? leftAxisMin) { ??

?????????????_linechartView.leftAxis.axisMaxValue = 10; ?

? }else{ ?? ? ? ? ? ? ?

? ? ? ? ? ? _linechartView.leftAxis.axisMaxValue = topNum * _scale; ?

? } ?? ? ?? ? ?

????? if (leftAxisMin < 0) { ?

????? ? ? CGFloat minNum = leftAxisMin * (5.0/4.0); ?

????? ? ? _linechartView.leftAxis.axisMinValue = minNum ; ?

????? } ?? ? ?? ? ? ?

? ? ? ?// 設置Y軸數據 ?

? ????_linechartView.leftAxis.valueFormatter = self; //需要遵IChartAxisValueFormatter協議 ? ?

????// 設置折線數據 ?

????? LineChartDataSet *chartDataSet? = nil; ?

????? chartDataSet = [[LineChartDataSet alloc] initWithValues:statistics label:title]; ? ?

? ? ? [chartDataSet setColor:color];????? //折線顏色 ?? ? ? ?

? ? ?chartDataSet.valueFont = [UIFont systemFontOfSize:12]; ? ? //折線字體大小? ? ? ? ? ? ? ? ?

? ? ?chartDataSet.valueFormatter = self;? ?//需要遵循IChartValueFormatter協議 ? ?

? ? ? chartDataSet.lineWidth = 1.0f;????//折線寬度 ?

????? chartDataSet.valueColors = @[color];???? //折線拐點處顯示數據的顏色 ? ?

? ? ? chartDataSet.drawCirclesEnabled = NO;????//是否繪制拐點 ? ?

? ? ? chartDataSet.axisDependency = AxisDependencyLeft;???? //軸線方向 ?

? ????chartDataSet.highlightColor = [UIColor clearColor];????//選中線條顏色 ? ?

? ? ? chartDataSet.highlightLineWidth = 1.00f; ? ?

? ? ? chartDataSet.drawCircleHoleEnabled = YES;?????//是否繪制中間的空心 ? ?

? ? ? // chartDataSet.circleHoleRadius = 2.0f;???? //空心的半徑 ?

? ????// chartDataSet.circleHoleColor = WKOrangeColor;???? //空心的顏色 ?? ?

? ? ?chartDataSet.drawFilledEnabled = YES;//是否填充顏色 ?

? ? ?NSArray *gradientColors = @[(id)[ChartColorTemplates colorFromString:@"#ffffff"].CGColor, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (id)[ChartColorTemplates colorFromString:@"#f9511e"].CGColor]; ? ?

????CGGradientRef gradientRef = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil); ?

? ? chartDataSet.fillAlpha = 0.7f;//透明度 ? ?

? ? chartDataSet.fill = [ChartFill fillWithLinearGradient:gradientRef angle:90.0f]; //賦值填充顏色對象 ? ?

? ? CGGradientRelease(gradientRef); ?? ? ?

? ? ?return chartDataSet;

}

#pragma mark - IChartValueFormatter delegate (折線值)

- (NSString *)stringForValue:(double)value entry:(ChartDataEntry *)entry dataSetIndex:(NSInteger)dataSetIndex viewPortHandler:(ChartViewPortHandler *)viewPortHandler { ?? ? ? ?

????return nil; ? ?

????// return [NSString stringWithFormat:@"%@", value];

}

#pragma mark - IChartAxisValueFormatter delegate (y軸值) (x軸的值寫在DateValueFormatter類里, 都是這個協議方法)

- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis { ?? ? ?

????? if (ABS(value) > 1000) { ? ? ? ?

????????return [NSString stringWithFormat:@"%.1fk", value/(double)1000]; ? ?

} ?? ? ? ?

????????return [NSString stringWithFormat:@"%0.2f", value];

}

6、ViewController調用




關于氣泡

從github上下載charts源碼,從里邊找到BalloonMarker的類然后add進自己的項目里,我的氣泡是UI給的圖,所以還需要在BalloonMarker里修改下(前面已經將工程中swift版本設置為4.0版本,不然BalloonMarker里的NSAttributedStringKey會報錯)

初始化Chart默認選中位置顯示氣泡

//默認選中氣泡

? ? NSString *lastValue = _yValueArr.lastObject; ?

????? [_linechartView highlightValueWithX:_xValueArr.count-1? y:[lastValue doubleValue]? dataSetIndex:0 callDelegate:NO];


根據需求找到圖片紅框內的代碼行數自行修改即可





最后,這只是charts其中的一個折線功能使用,里邊還有K線圖、泡泡圖、雷達圖、柱狀圖等等,還可混合成復合圖表如炒股的盯盤圖表,就不一一表述了,網上也有很多資料可自行查找

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375