zoukankan      html  css  js  c++  java
  • 【iOS】图表实现-Charts(一)

    前几天把AAChartsKit的使用简单写了写,官方使用说明已经写的很详细了。我也就不多说了,今天就讲讲Charts的使用。

    0.简介

    近期项目需要使用到折线图这样的图表功能,因此接触到了Charts这个框架,不得不说这个图表框架很强大,但是在GitHub上Charts的介绍也比较简单的介绍(直说了和MPAndroidChart类似,大部分使用方法一致),就写写自己的一点心得供大家参考。

    Charts使用swift编写,它是仿照MPAndroidChart实现的。所以在安卓和iOS上可以实现一致的效果。如果你们的APP想在两端实现统一的效果,就可以使用这个图标库。

    废话不多说了。开始讲解使用方法吧。

    1.导入三方库

    charts支持cocoapods导入,这就对大多数开发者比较方便了。但是就是使用cocoapdos也需要注意些地方。

    由于charts使用swift编写,在swift编写的项目中使用比较方便,在这篇文章中就不详细描述了。但是现如今还是有很多项目使用oc编写,就如我的这个项目。这就需要了解一些oc和swift的桥接了。这就需要看别的文章了。回归正题,开始讲cocoapdos的导入吧。

    (1)podfile的设置 

    (2)将工程中Pods的编译语言设置为SWIFT最新版本

    build Settings ->Swift Language Version 改为最新版本

    (3)将Chart.framework添加到新建的项目中

    点击新建的项目->Build Phases->Link Binary With Libraries-> "+" -> 找到Charts.frame添加

    (4)添加OC与Switf桥接

        在工程中新建一个Swift文件,名字随便取,如"Chart-Bridging-Header.h",这时候会提示是否建立桥接文件,直接选Create Bridging Header选项,名字无所谓,会自动建立一个桥接文件。在桥接文件里写入@import Charts;

    到了这一步,导入就完成了。你就可以在自己的项目使用。

    参考文档:博客一博客二

    2.使用

    设置Chatview的属性

    (1)scale属性

    顾名思义,就是图标是否支持拖拽,scaleYEnabled = YES即纵坐标支持拖拽,scaleXEnabled = YES即横坐标支持拖拽。

    (2)chartDescription属性

    打开这个属性,你的图表上将会有关于你的图标的描述。

    (3)pinchZoomEnabled

    是否支持X轴、Y轴同时缩放,如果是YES ,则代表支持同时缩放。

    (4)maxVisibleCount

    这个属性是控制图标上的数字展示的最大个数的,如果你的图标不想显示上面的数字,就可以把maxVisibleCount属性设置为0。

    (5)legend

    这个Bool属性是设置要不要显示图例的,看到上图底部的"-- DataSet 1"了吗,如果你不想要显示这一栏,就把legend.enabled设置为NO。

    (6)noDataText

    没有数据的时候ChartsView上需要显示什么文字。chartsView中有三个重要的属性需要开发者去设置,那就是leftAxis(左轴),rightAxis(右轴),xAxis(X轴)。

    (7)doubleTapToZoomEnabled

    是否允许双击缩放。

    (8)delegate

    代理,大家都懂的。对应的protocal有4个,都是可选选项

    //图表中的数值被选中
    - (void)chartValueSelected:(ChartViewBase * _Nonnull)chartView entry:(ChartDataEntry * _Nonnull)entry highlight:(ChartHighlight * _Nonnull)highlight;
    //图表中的空白区域被点击
    - (void)chartValueNothingSelected:(ChartViewBase * _Nonnull)chartView;
    //图表缩放
    - (void)chartScaled:(ChartViewBase * _Nonnull)chartView scaleX:(CGFloat)scaleX scaleY:(CGFloat)scaleY;
    //图标被移动
    - (void)chartTranslated:(ChartViewBase * _Nonnull)chartView dX:(CGFloat)dX dY:(CGFloat)dY;

    Axis属性
    (1)enabled
    设置为NO的话,则对应的坐标轴不显示。
    (2)labelPosition
    表示左轴坐标的位置,有2个选项:YAxisLabelPositionOutsideChart = 0,YAxisLabelPositionInsideChart = 1,坐标显示在轴内或者是轴外。
    (3)labelCount
    即在坐标轴上最多显示多少个坐标点
    (4)drawGridBackgroundEnabled
    是否要画网格线
    (5)gridLineDashLengths
    gridLineDashLengths = @[@2.f, @5.f]即线段宽为2.0f,空格宽为5.0f。

     举个例子:

    LineChartView *lineChartView = [[LineChartView alloc] init];
        [self.view addSubview:lineChartView];
        self.lineChartView = lineChartView;
    
        lineChartView.doubleTapToZoomEnabled = NO;//禁止双击缩放 有需要可以设置为YES
        lineChartView.gridBackgroundColor = [UIColor clearColor];//表框以及表内线条的颜色以及隐藏设置 根据自己需要调整
        lineChartView.borderColor = [UIColor clearColor];
        lineChartView.drawGridBackgroundEnabled = NO;
        lineChartView.drawBordersEnabled = NO;
        lineChartView.descriptionText = @"XXX";//该表格的描述名称
        lineChartView.descriptionTextColor = [UIColor whiteColor];//描述字体颜色
        lineChartView.legend.enabled = YES;//是否显示折线的名称以及对应颜色 多条折线时必须开启 否则无法分辨
        lineChartView.legend.textColor = [UIColor whiteColor];//折线名称字体颜色
    
        //设置动画时间
        [lineChartView animateWithXAxisDuration:1];
    
        //设置纵轴坐标显示在左边而非右边
        rightAxis = lineChartView.rightAxis;
        rightAxis.drawGridLinesEnabled = NO;
    
        leftAxis = lineChartView.leftAxis;
        leftAxis.drawGridLinesEnabled = NO;
        leftAxis.labelTextColor = [UIColor whiteColor];
    
        //设置横轴坐标显示在下方 默认显示是在顶部
        xAxis = lineChartView.xAxis;
        xAxis.labelPosition = XAxisLabelPositionBottom;
        xAxis.labelTextColor = [UIColor whiteColor];
        xAxis.labelCount = 3;

    3.设置完属性后,就是填充数据了

    在这里我仅以折线图表为例。

    我们先介绍两个概念:set和data,LineChartData就是折线图的data类,它可以由很多组set组成,一组就是一条折线。因此我们可以定义set的属性,从而绘制各种各样的折线。示例如下:

    //是否绘制图标
    set1.drawIconsEnabled = NO;
    //折线颜色
    [set1 setColor:UIColor.blackColor];
    //折线点的颜色
    [set1 setCircleColor:UIColor.blackColor];
    //折线的宽度
    set1.lineWidth = 1.0;
    //折线点的宽度
    set1.circleRadius = 3.0;
    //是否画空心圆
    set1.drawCircleHoleEnabled = NO;
    //折线点的值的大小
    set1.valueFont = [UIFont systemFontOfSize:9.f];
    //图例的线宽
    set1.formLineWidth = 1.0;
    //图例的字体大小
    set1.formSize = 15.0;

    开始填充

    //定义一个数组承接数据
    //对应Y轴上面需要显示的数据
        NSMutableArray *yVals = [[NSMutableArray alloc] init];
        for (int i = 0; i < self.financeLineDotDataList.count; i++) {
            
            BTCTrenddata *dotData = (BTCTrenddata *)[self.financeLineDotDataList objectAtIndex:i];
            //将横纵坐标以ChartDataEntry的形式保存下来,注意横坐标值一般是i的值,而不是你的数据    //里面具体的值,如何将具体数据展示在X轴上我们下面将会说到。
            ChartDataEntry *entry = [[ChartDataEntry alloc] initWithX:i y:dotData.price];
            [yVals addObject:entry];
        }
        
        LineChartDataSet *set1 = nil;
        //请注意这里,如果你的图表以前绘制过,那么这里直接重新给data赋值就行了。
        //如果没有,那么要先定义set的属性。
        if (self.financeLineChartsView.data.dataSetCount > 0) {
            LineChartData *data = (LineChartData *)self.financeLineChartsView.data;
            set1 = (LineChartDataSet *)data.dataSets[0];
            //        set1.yVals = yVals;
            
            set1 = (LineChartDataSet *)self.financeLineChartsView.data.dataSets[0];
            set1.values = yVals;
            //通知data去更新
            [self.financeLineChartsView.data notifyDataChanged];
            //通知图表去更新
            [self.financeLineChartsView notifyDataSetChanged];
            
        }else{
            
            
            //创建LineChartDataSet对象
            set1 = [[LineChartDataSet alloc] initWithValues:yVals];
            //自定义set的各种属性
            //设置折线的样式
            set1.drawIconsEnabled = NO;
            set1.formLineWidth = 1.1;//折线宽度
            set1.formSize = 15.0;
            set1.drawValuesEnabled = YES;//是否在拐点处显示数据
            set1.valueColors = @[[UIColor whiteColor]];//折线拐点处显示数据的颜色
            [set1 setColor:RGBCOLOR(248, 144, 28)];//折线颜色
            //折线拐点样式
            set1.drawCirclesEnabled = NO;//是否绘制拐点
            //第二种填充样式:渐变填充
            set1.drawFilledEnabled = YES;//是否填充颜色
            NSArray *gradientColors = @[(id)RGBACOLOR(218,168,42,0).CGColor,
                                        (id)RGBACOLOR(248,223,91,1).CGColor];
            CGGradientRef gradientRef = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil);
            set1.fillAlpha = 1.0f;//透明度
            set1.fill = [ChartFill fillWithLinearGradient:gradientRef angle:90.0f];//赋值填充颜色对象
            CGGradientRelease(gradientRef);//释放gradientRef
            
            //点击选中拐点的交互样式
            set1.highlightEnabled = YES;//选中拐点,是否开启高亮效果(显示十字线)
            set1.highlightColor = RGBCOLOR(125, 125, 125);//点击选中拐点的十字线的颜色
            set1.highlightLineWidth = 1.1/[UIScreen mainScreen].scale;//十字线宽度
            set1.highlightLineDashLengths = @[@5, @5];//十字线的虚线样式
            
            //将 LineChartDataSet 对象放入数组中
            NSMutableArray *dataSets = [[NSMutableArray alloc] init];
            [dataSets addObject:set1];
            
            //创建 LineChartData 对象, 此对象就是lineChartView需要最终数据对象
            LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets];
            [data setValueFont:[UIFont systemFontOfSize:8.f]];//文字字体
            [data setValueTextColor:[UIColor whiteColor]];//文字颜色
            
            self.financeLineChartsView.data = data;
            //这里可以调用一个加载动画即1s出来一个绘制点
            [self.financeLineChartsView animateWithXAxisDuration:1.0f];
            
        }

    到了这一步,就基本结束了数据填充。我们也就完成了基本图表操作。

    补充:masnory添加图表k线图

    写到这里就基本完成了基础操作,下一篇文章我会把我遇到的一些问题写出来。

  • 相关阅读:
    调用匿名函数的骚操作
    angular,vue,react的父子通信
    JavaScript高阶函数的应用
    图解javascript中this指向
    前端开发必备
    MEAN-全栈javascript开发框架
    MongoDB初识
    ES6新特性概览
    为什么是link-visited-hover-active
    CSS布局 — 圣杯布局与双飞翼布局
  • 原文地址:https://www.cnblogs.com/weicyNo-1/p/10154969.html
Copyright © 2011-2022 走看看