【iOS開發】 關于Charts框架第二期:平滑折線圖,X軸顯示自定義

之前寫了一期Charts框架的集成以及折線圖的簡單實現,需要的看這里傳送門

那么最近又需要繪圖, 所以來更新下最新的使用。

Charts框架最新版本是v3.4.0, 從v3.0版本開始, 有了一些重大更改,摘錄了一部分在下面:

x索引已失效。引誘:x值。現在,每個條目都有一個x和一個y。
餅圖/雷達圖不再具有X索引的概念
統一的XAxis / YAxis功能和經驗。
軸的統一格式器接口。
用于y值的新格式化程序,不再從NSNumberFormatter繼承,以具有dataSet和視口信息以做出更好的格式化決策。

所有數據集構造函數都已更改-它們不再采用x索引數組。
所有條目構造函數均已更改-它們采用X和Y。

其實對我們影響更大的部分是一些類方法需要替換,比如:用[[LineChartDataSet alloc]initWithEntries:yVals label:nil]; 替換[[LineChartDataSet alloc]initWithValues:yVals label:nil];

所以下面重新梳理一下折線圖的繪制,注解會更詳細:

  • 創建LineChartView
- (LineChartView *)lineChartView
{
    if (!_lineChartView)
    {
        _lineChartView = [[LineChartView alloc] init];
        _lineChartView.backgroundColor =  [UIColor clearColor];
        _lineChartView.delegate = self;
        
        // 設置間隙
        [_lineChartView setExtraOffsetsWithLeft:0 top:20 right:0 bottom:10];
        
        // 關于圖表的描述
        _lineChartView.noDataText = @"暫無數據";
        _lineChartView.chartDescription.enabled = YES;
        
        // 關閉圖例顯示
        _lineChartView.legend.enabled = NO;
        
        // x/y軸是否支持拖拽
        _lineChartView.scaleYEnabled = YES;
        _lineChartView.scaleXEnabled = YES;
        
        // 是否支持雙擊縮放
        _lineChartView.doubleTapToZoomEnabled = NO;
        
        // 啟用拖拽
        _lineChartView.dragEnabled = NO;
        
        // 展現動畫
        [_lineChartView animateWithYAxisDuration:0.75f];
        
        // Y軸設置
        ChartYAxis *leftAxis = _lineChartView.leftAxis;
        leftAxis.enabled = YES;
        leftAxis.axisLineColor = [UIColor clearColor];         // Y軸顏色
        leftAxis.labelFont = SystemFontSize(10);
        leftAxis.labelTextColor = UIColorFromHEXA(0xFFFFFF, 0.6);
        leftAxis.gridColor = UIColorFromHEXA(0xffffff, 0.6);   // 網格線顏色
        leftAxis.granularityEnabled = NO;                      // 是否開啟j抗鋸齒,默認打開
        leftAxis.drawZeroLineEnabled = YES;                    // 繪制零線
        leftAxis.zeroLineColor = [UIColor blueColor];
        [leftAxis setXOffset:15.0f];
        leftAxis.labelCount = 6;                              // 強制固定label個數
        leftAxis.forceLabelsEnabled = YES;
        
        _lineChartView.rightAxis.enabled = NO; // 不繪制右邊軸
        
        // X軸設置
        ChartXAxis *xAxis = _lineChartView.xAxis;
        xAxis.labelPosition = XAxisLabelPositionBottom;        // 設置x軸數據在底部
        xAxis.axisLineColor = [UIColor clearColor];
        xAxis.labelFont = SystemFontSize(10);
        xAxis.labelTextColor = UIColorFromHEXA(0xFFFFFF, 0.6);
        xAxis.gridColor = [UIColor clearColor];
        xAxis.avoidFirstLastClippingEnabled = YES;
        [xAxis setYOffset:15.0f];
        xAxis.labelCount = 6;                              // 強制固定label個數
        xAxis.forceLabelsEnabled = YES;
        xAxis.valueFormatter = [[LWOtherDataXAxisFormatter alloc] init];
    }
    return _lineChartView;
}
  • 顯示數據處理
- (void)setLineChartWithXData:(NSArray *)xData yData:(NSArray *)yData
{
    if (xData.count > 0)
    {
        //對應Y軸上面需要顯示的數據
        NSMutableArray *yVals = [[NSMutableArray alloc] init];
        
        for (int i = 0; i < yData.count; i++) {
            
            ChartDataEntry *entry = [[ChartDataEntry alloc] initWithX:[xData[i] doubleValue] y:[yData[i] doubleValue]];
            [yVals addObject:entry];
        }
        
        LineChartDataSet *set1 = [[LineChartDataSet alloc]initWithEntries:yVals label:nil];
        
        // 折線寬度
        set1.lineWidth = 3.0f;
        
        // 折線顏色
        [set1 setColor:UIColorFromHEXA(0xFFD14F, 1.0)];
        
        // 折線模式
        set1.mode = LineChartModeCubicBezier;
        
        // 是否填充顏色
        set1.drawFilledEnabled = YES;
        
        // 是否繪制拐點
        set1.drawCirclesEnabled = NO;
        
        // 是否在拐點處顯示數據
        set1.drawValuesEnabled = NO;
        
        // 拐點圓設置
        set1.circleRadius = 7.0f;                              // 半徑
        set1.circleColors = @[WhiteColor];                     // 圓圈顏色
        set1.circleHoleColor = UIColorFromHEXA(0xFFD14F, 1.0); // 圓圈孔中間顏色
        set1.circleHoleRadius = 2.5f;                          // 圓圈孔半徑
        
        LineChartData *data = [[LineChartData alloc]initWithDataSet:set1];
        
        _lineChartView.data = data;
    }
}

基本這些已經夠我們繪制一個好看,平滑且有背景遮罩的折線圖了。

但是我根據需求處理的時候發現了一個問題, 服務器返回的數據, x軸的時間點是“8:30”這種格式, 在進行doubleValue轉變后,X軸的值就變成了“8.00”,導致8:00 和 8:30 都顯示為8.00

所以這里就需要我們引入協議IChartAxisValueFormatter

聲明一個NSObject類,讓其遵循IChartAxisValueFormatter協議,重寫-(NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis方法,然后設置X軸的valueFormatter,即xAxis.valueFormatter

#import <Foundation/Foundation.h>
#import <Charts/Charts-Swift.h>

NS_ASSUME_NONNULL_BEGIN

@interface LWOtherDataXAxisFormatter : NSObject<IChartAxisValueFormatter>

@end

NS_ASSUME_NONNULL_END
#import "LWOtherDataXAxisFormatter.h"

@implementation LWOtherDataXAxisFormatter

- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis{
    
    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:value];
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm"];
    NSString *strDate = [dateFormatter stringFromDate:date];
    
    return strDate;
}

@end

這里重寫stringForValue 方法時, 根據自己需求,自行處理即可。

使用:

ChartXAxis *xAxis = _lineChartView.xAxis;
xAxis.valueFormatter = [[LWOtherDataXAxisFormatter alloc] init];

這樣就ok了。

關于指示器maskView,是完全可以自定義的,ChartMarkerView添加一個子視圖即可:

ChartMarkerView * makerView = [[ChartMarkerView alloc]init];

MaskView *masker = [[MaskView alloc] initWithFrame:CGRectMake(0, 0, 100, 44)];
[makerView addSubview:masker];

視圖是否支持顯示指示器:chartView.drawMarkers = YES;

最后寫一下ChartViewDelegate,常用的代理也就是第一個:

- (void)chartValueSelected:(ChartViewBase *)chartView entry:(ChartDataEntry *)entry highlight:(ChartHighlight *)highlight
{
    NSLog(@"數值被選中,可更新指示器顯示, maskView可以自定義");
}

- (void)chartValueNothingSelected:(ChartViewBase *)chartView{
    NSLog(@"空白區域被選中");
}

- (void)chartScaled:(ChartViewBase *)chartView scaleX:(CGFloat)scaleX scaleY:(CGFloat)scaleY{
    NSLog(@"視圖被縮放");
}

- (void)chartTranslated:(ChartViewBase *)chartView dX:(CGFloat)dX dY:(CGFloat)dY{
    NSLog(@"視圖被移動");
}

以上, End。

對你有幫助的話,記得點個??哦~

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

推薦閱讀更多精彩內容

  • This chapter covers the basic setup for using this librar...
    ngugg閱讀 1,028評論 0 1
  • 最近公司項目中要加一個折線圖的需求因為是金融項目考慮到后期可能會有大量的餅狀和折線圖的需求,仔細搜索一番覺得用個成...
    約翰丶碼農閱讀 19,198評論 10 24
  • 一、下載Charts后可以到里面的內容 將下載后解壓后的整個文件夾復制到工程里 但是只導入 工程Charts.xc...
    浪周周_f157閱讀 1,116評論 0 1
  • 最近做項目需要畫K線圖和折線圖,引入了第三方的圖標庫Charts。 這個圖表庫基本上能夠滿足大家對于圖表繪制的...
    f62385835449閱讀 29,839評論 38 39
  • 8. Setting Colors Since release v1.4.0, the ColorTemplate...
    ngugg閱讀 724評論 0 0