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阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345