iOS 折線圖實(shí)現(xiàn):漸變色填充顷歌,氣泡看峻,動(dòng)態(tài)放大縮小,線條動(dòng)畫衙吩,添加限制線等

OC 項(xiàng)目中遇到了折線圖互妓,使用了第三方庫 Charts,Charts 是用 Swift 實(shí)現(xiàn)的,因此如果是 OC 項(xiàng)目的話冯勉,還需要對(duì) Xcode 進(jìn)行一些設(shè)置澈蚌,這里簡單介紹下,從集成 Charts 到繪制出折線圖灼狰。

先貼出效果圖宛瞄,demo 地址在最底部:
折線圖

實(shí)現(xiàn)步驟如下:

1. 首先創(chuàng)建一個(gè) OC 項(xiàng)目,然后用 pod 安裝 Charts交胚,或者直接把 Charts 拉進(jìn)項(xiàng)目份汗,簡單起見,我這里直接將下載好的 Charts.xcodeproj 拉進(jìn)項(xiàng)目蝴簇,如下圖:

記得要把三方庫拉進(jìn) Embedded Binaries杯活,如下圖:


2. 接著將項(xiàng)目的 PROJECT 以及 TARGETS 內(nèi)的 Swift Language Version 改成可用的版本,我這邊 Xcode 版本號(hào)10.1熬词,可用的 Swift 版本有3旁钧、4、4.2互拾。

不要忘記拉進(jìn)來的三方庫Charts.xcodeproj 內(nèi)的 PROJECT 以及 TARGETS的 Swift Language Version 也要更改成和上面的一樣歪今,不然會(huì)報(bào)錯(cuò)。

3. 創(chuàng)建一個(gè)橋接文件颜矿,格式是項(xiàng)目名-Bridging-Header.h寄猩,在橋接文件里導(dǎo)入 Charts,@import Charts;骑疆。接著在需要用到折線圖的類里面導(dǎo)入項(xiàng)目名-Bridging-Header.h即可田篇。

接下來就可以使用 Charts 滿足我們的業(yè)務(wù)需要了。

1. 創(chuàng)建折線圖并設(shè)置其基本樣式:
    self.lineChartView = [[LineChartView alloc] init];
    self.lineChartView.delegate = self;//設(shè)置代理
    [self.view addSubview:self.lineChartView];

    // 基本樣式
    self.lineChartView.backgroundColor =  [UIColor colorWithRed:230/255.0f green:253/255.0f blue:253/255.0f alpha:1];
    self.lineChartView.noDataText = @"暫無數(shù)據(jù)";
    // 交互樣式
    self.lineChartView.scaleYEnabled = NO; // 取消Y軸縮放
    self.lineChartView.scaleXEnabled = NO; // 取消X軸縮放
    self.lineChartView.pinchZoomEnabled = NO; // 取消XY軸同時(shí)縮放
    self.lineChartView.doubleTapToZoomEnabled = NO; // 取消雙擊縮放
    self.lineChartView.legend.enabled = NO;// 不顯示圖例說明
    self.lineChartView.dragEnabled = YES; // 啟用拖拽圖表
    self.lineChartView.dragDecelerationEnabled = YES; // 拖拽后是否有慣性效果
    self.lineChartView.dragDecelerationFrictionCoef = 0.9; // 拖拽后慣性效果的摩擦系數(shù)(0~1)封断,數(shù)值越小,慣性越不明顯
    // X軸樣式
    ChartXAxis *xAxis = self.lineChartView.xAxis;
    xAxis.axisLineWidth = 1.0; // 設(shè)置X軸線寬
    xAxis.labelPosition = XAxisLabelPositionBottom; // X軸的顯示位置舶担,默認(rèn)是顯示在上面的
    xAxis.drawGridLinesEnabled = NO; // 不繪制網(wǎng)格線
    xAxis.labelTextColor = [self colorWithHexString:@"#057748"];//label文字顏色
    DateValueFormatter *valueFormatter = [[DateValueFormatter alloc] init];//坐標(biāo)數(shù)值樣式
    xAxis.valueFormatter = valueFormatter;
    
    // Y軸樣式
    self.lineChartView.rightAxis.enabled = NO;//不繪制右邊軸
    ChartYAxis *leftAxis = self.lineChartView.leftAxis;//獲取左邊Y軸
    leftAxis.labelCount = 2; // Y軸label數(shù)量坡疼,數(shù)值不一定,如果forceLabelsEnabled等于YES, 則強(qiáng)制繪制制定數(shù)量的label, 但是可能不平均
    leftAxis.forceLabelsEnabled = NO; // 不強(qiáng)制繪制指定數(shù)量的label
    leftAxis.axisMinimum = 0; // 設(shè)置Y軸的最小值
    leftAxis.drawZeroLineEnabled = YES;
    leftAxis.axisMaximum = 120; // 設(shè)置Y軸的最大值
    leftAxis.inverted = NO; // 是否將Y軸進(jìn)行上下翻轉(zhuǎn)
    leftAxis.axisLineWidth = 1.0/[UIScreen mainScreen].scale; // Y軸線寬
    leftAxis.axisLineColor = [UIColor blackColor]; // Y軸顏色
    leftAxis.labelPosition = YAxisLabelPositionOutsideChart; // label位置
    leftAxis.labelTextColor = [self colorWithHexString:@"#057748"]; // 文字顏色
    leftAxis.labelFont = [UIFont systemFontOfSize:10.0f]; // 文字字體
    leftAxis.gridLineDashLengths = @[@3.0f, @3.0f]; // 設(shè)置虛線樣式的網(wǎng)格線
    leftAxis.gridColor = [UIColor colorWithRed:200/255.0f green:200/255.0f blue:200/255.0f alpha:1]; // 網(wǎng)格線顏色
    leftAxis.gridAntialiasEnabled = YES; // 開啟抗鋸齒
2. 添加限制線
    // 添加限制線
    ChartLimitLine *limitLine = [[ChartLimitLine alloc] initWithLimit:100 label:@""];
    limitLine.lineWidth = 1;
    limitLine.lineColor = [self colorWithHexString:@"#c83c23"]; // 限制線顏色
    limitLine.lineDashLengths = @[@5.0f, @5.0f]; // 虛線樣式
    limitLine.labelPosition = ChartLimitLabelPositionTopRight; // 位置
//    limitLine.valueTextColor = [self colorWithHexString:@"#057748"];//label文字顏色
//    limitLine.valueFont = [UIFont systemFontOfSize:12];//label字體
    [leftAxis addLimitLine:limitLine];//添加到Y(jié)軸上
    leftAxis.drawLimitLinesBehindDataEnabled = YES;//設(shè)置限制線繪制在折線圖的后面
3. 添加描述及圖例樣式衣陶,這個(gè)可有可無柄瑰,一般顯示在右下角或左下角
    //描述及圖例樣式
    ChartDescription *description = [[ChartDescription alloc] init];
    description.text = @"折線圖";
    description.textColor = [UIColor darkGrayColor];
    [self.lineChartView setChartDescription:description];
    self.lineChartView.legend.form = ChartLegendFormLine;
    self.lineChartView.legend.formSize = 30;
    self.lineChartView.legend.textColor = [UIColor darkGrayColor];
4. 添加氣泡效果,BalloonMarker 是 Charts 中的一個(gè)類文件剪况,直接拉進(jìn)來即可
    // 顯示氣泡效果
    BalloonMarker *marker = [[BalloonMarker alloc]
                             initWithColor: [UIColor colorWithWhite:0/255. alpha:0.7]
                             font: [UIFont boldSystemFontOfSize:10.0]
                             textColor: UIColor.whiteColor
                             insets: UIEdgeInsetsMake(2, 0, 0, 0)];
    marker.chartView = _lineChartView;
    marker.arrowSize = CGSizeMake(10, 10);
//    marker.color = [UIColor greenColor];
    marker.minimumSize = CGSizeMake(40, 30);
    marker.chartView = _lineChartView;
    _lineChartView.marker = marker;
5. 設(shè)置數(shù)據(jù)(可以根據(jù)業(yè)務(wù)需要設(shè)置是否需要漸變填充教沾,是否需要曲線,需要顯示多少數(shù)據(jù)等)
    NSMutableArray *yVals1 = [[NSMutableArray alloc] init];
    
    int count = 11;//X軸上要顯示多少條數(shù)據(jù)
    double range = 50;//Y軸的值

    for (int i = 8; i < 8+count; i++) {
        double mult = (range + 1);
        double val = (double) (arc4random_uniform(mult)) + 20;
        [yVals1 addObject:[[ChartDataEntry alloc] initWithX:i y:val]];
    }
    
    LineChartDataSet *set1 = nil;
    if (_lineChartView.data.dataSetCount > 0) {
        set1 = (LineChartDataSet *)_lineChartView.data.dataSets[0];
        [set1 replaceEntries:yVals1];
        [_lineChartView.data notifyDataChanged];
        [_lineChartView notifyDataSetChanged];
    } else {
        set1 = [[LineChartDataSet alloc] initWithEntries:yVals1 label:@"lineName"];
        // 曲線模式
        set1.mode = LineChartModeCubicBezier;
        set1.cubicIntensity = 0.2; // 曲線弧度
        set1.lineWidth = 1.0;
        set1.circleRadius = 4.0;
        
        // 拐點(diǎn)
        set1.drawCirclesEnabled = NO; // 是否繪制拐點(diǎn)
        set1.drawValuesEnabled = NO;//是否在拐點(diǎn)處顯示數(shù)據(jù)
        set1.drawCircleHoleEnabled = YES;//是否繪制中間的空心
        set1.circleHoleRadius = 2.0f;//空心的半徑
        set1.circleHoleColor = [UIColor blackColor];//空心的顏色
        [set1 setCircleColor:UIColor.yellowColor];
        set1.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f];
        
        //  單純的顏色填充
//        [set1 setColor:UIColor.redColor];
//        set1.fillColor = UIColor.blueColor;
//        set1.fillAlpha = 0.1;
//        set1.drawFilledEnabled = YES;
        
        // 漸變色顏色填充
        set1.drawFilledEnabled = YES;//是否填充顏色
        NSArray *gradientColors = @[(id)[ChartColorTemplates colorFromString:@"#FFFFFFFF"].CGColor,
                                    (id)[ChartColorTemplates colorFromString:@"#FF007FFF"].CGColor];
        CGGradientRef gradientRef = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil);
        set1.fillAlpha = 0.8f; //透明度
        set1.fill = [ChartFill fillWithLinearGradient:gradientRef angle:90.0f]; //賦值填充顏色對(duì)象
        CGGradientRelease(gradientRef); // 釋放gradientRef
        
        // 點(diǎn)擊選中拐點(diǎn)的交互樣式
        set1.highlightEnabled = YES; // 選中拐點(diǎn),是否開啟高亮效果(顯示十字線)
        set1.highlightColor = [self colorWithHexString:@"#c83c23"];//點(diǎn)擊選中拐點(diǎn)的十字線的顏色
        set1.highlightLineWidth = 1.0;//十字線寬度
        set1.highlightLineDashLengths = @[@5, @5];//十字線的虛線樣式

        set1.drawHorizontalHighlightIndicatorEnabled = NO;
        set1.fillFormatter = [[CubicLineSampleFillFormatter alloc] init];
        
        LineChartData *data = [[LineChartData alloc] initWithDataSet:set1];
        [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:9.f]];
        [data setDrawValues:NO];
        _lineChartView.data = data;
    }

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末译断,一起剝皮案震驚了整個(gè)濱河市授翻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖堪唐,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巡语,死亡現(xiàn)場離奇詭異,居然都是意外死亡淮菠,警方通過查閱死者的電腦和手機(jī)男公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來合陵,“玉大人枢赔,你說我怎么就攤上這事∮抵” “怎么了踏拜?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長举庶。 經(jīng)常有香客問我执隧,道長,這世上最難降的妖魔是什么户侥? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任镀琉,我火速辦了婚禮,結(jié)果婚禮上蕊唐,老公的妹妹穿的比我還像新娘屋摔。我一直安慰自己,他們只是感情好替梨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布钓试。 她就那樣靜靜地躺著,像睡著了一般副瀑。 火紅的嫁衣襯著肌膚如雪弓熏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天糠睡,我揣著相機(jī)與錄音挽鞠,去河邊找鬼。 笑死狈孔,一個(gè)胖子當(dāng)著我的面吹牛信认,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播均抽,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼嫁赏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油挥?” 一聲冷哼從身側(cè)響起潦蝇,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤款熬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后护蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體华烟,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年持灰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盔夜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堤魁,死狀恐怖喂链,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妥泉,我是刑警寧澤椭微,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站盲链,受9級(jí)特大地震影響蝇率,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刽沾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一本慕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侧漓,春花似錦锅尘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纵揍,卻和暖如春顿乒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泽谨。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工璧榄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隔盛。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓犹菱,卻偏偏與公主長得像拾稳,于是被迫代替她去往敵國和親吮炕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359