【iOS開發(fā)】 關(guān)于Charts框架第二期:平滑折線圖管引,X軸顯示自定義

之前寫了一期Charts框架的集成以及折線圖的簡單實(shí)現(xiàn)士败,需要的看這里傳送門

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

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

x索引已失效重慢。引誘:x值〖⒈郏現(xiàn)在,每個(gè)條目都有一個(gè)x和一個(gè)y似踱。
餅圖/雷達(dá)圖不再具有X索引的概念
統(tǒng)一的XAxis / YAxis功能和經(jīng)驗(yàn)隅熙。
軸的統(tǒng)一格式器接口。
用于y值的新格式化程序核芽,不再從NSNumberFormatter繼承囚戚,以具有dataSet和視口信息以做出更好的格式化決策。

所有數(shù)據(jù)集構(gòu)造函數(shù)都已更改-它們不再采用x索引數(shù)組轧简。
所有條目構(gòu)造函數(shù)均已更改-它們采用X和Y驰坊。

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

所以下面重新梳理一下折線圖的繪制哮独,注解會更詳細(xì):

  • 創(chuàng)建LineChartView
- (LineChartView *)lineChartView
{
    if (!_lineChartView)
    {
        _lineChartView = [[LineChartView alloc] init];
        _lineChartView.backgroundColor =  [UIColor clearColor];
        _lineChartView.delegate = self;
        
        // 設(shè)置間隙
        [_lineChartView setExtraOffsetsWithLeft:0 top:20 right:0 bottom:10];
        
        // 關(guān)于圖表的描述
        _lineChartView.noDataText = @"暫無數(shù)據(jù)";
        _lineChartView.chartDescription.enabled = YES;
        
        // 關(guān)閉圖例顯示
        _lineChartView.legend.enabled = NO;
        
        // x/y軸是否支持拖拽
        _lineChartView.scaleYEnabled = YES;
        _lineChartView.scaleXEnabled = YES;
        
        // 是否支持雙擊縮放
        _lineChartView.doubleTapToZoomEnabled = NO;
        
        // 啟用拖拽
        _lineChartView.dragEnabled = NO;
        
        // 展現(xiàn)動畫
        [_lineChartView animateWithYAxisDuration:0.75f];
        
        // Y軸設(shè)置
        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);   // 網(wǎng)格線顏色
        leftAxis.granularityEnabled = NO;                      // 是否開啟j抗鋸齒拳芙,默認(rèn)打開
        leftAxis.drawZeroLineEnabled = YES;                    // 繪制零線
        leftAxis.zeroLineColor = [UIColor blueColor];
        [leftAxis setXOffset:15.0f];
        leftAxis.labelCount = 6;                              // 強(qiáng)制固定label個(gè)數(shù)
        leftAxis.forceLabelsEnabled = YES;
        
        _lineChartView.rightAxis.enabled = NO; // 不繪制右邊軸
        
        // X軸設(shè)置
        ChartXAxis *xAxis = _lineChartView.xAxis;
        xAxis.labelPosition = XAxisLabelPositionBottom;        // 設(shè)置x軸數(shù)據(jù)在底部
        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;                              // 強(qiáng)制固定label個(gè)數(shù)
        xAxis.forceLabelsEnabled = YES;
        xAxis.valueFormatter = [[LWOtherDataXAxisFormatter alloc] init];
    }
    return _lineChartView;
}
  • 顯示數(shù)據(jù)處理
- (void)setLineChartWithXData:(NSArray *)xData yData:(NSArray *)yData
{
    if (xData.count > 0)
    {
        //對應(yīng)Y軸上面需要顯示的數(shù)據(jù)
        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;
        
        // 是否繪制拐點(diǎn)
        set1.drawCirclesEnabled = NO;
        
        // 是否在拐點(diǎn)處顯示數(shù)據(jù)
        set1.drawValuesEnabled = NO;
        
        // 拐點(diǎn)圓設(shè)置
        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;
    }
}

基本這些已經(jīng)夠我們繪制一個(gè)好看,平滑且有背景遮罩的折線圖了皮璧。

但是我根據(jù)需求處理的時(shí)候發(fā)現(xiàn)了一個(gè)問題舟扎, 服務(wù)器返回的數(shù)據(jù), x軸的時(shí)間點(diǎn)是“8:30”這種格式悴务, 在進(jìn)行doubleValue轉(zhuǎn)變后睹限,X軸的值就變成了“8.00”,導(dǎo)致8:00 和 8:30 都顯示為8.00

所以這里就需要我們引入?yún)f(xié)議IChartAxisValueFormatter

聲明一個(gè)NSObject類,讓其遵循IChartAxisValueFormatter協(xié)議邦泄,重寫-(NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis方法删窒,然后設(shè)置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 方法時(shí), 根據(jù)自己需求蕉拢,自行處理即可特碳。

使用:

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

這樣就ok了。

關(guān)于指示器maskView晕换,是完全可以自定義的午乓,ChartMarkerView添加一個(gè)子視圖即可:

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

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

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

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

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

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

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

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

以上益愈, End。

對你有幫助的話夷家,記得點(diǎn)個(gè)??哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒸其,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子库快,更是在濱河造成了極大的恐慌摸袁,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义屏,死亡現(xiàn)場離奇詭異靠汁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闽铐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蝶怔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兄墅,你說我怎么就攤上這事踢星。” “怎么了察迟?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵斩狱,是天一觀的道長。 經(jīng)常有香客問我扎瓶,道長所踊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任概荷,我火速辦了婚禮秕岛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己继薛,他們只是感情好修壕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遏考,像睡著了一般慈鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灌具,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天青团,我揣著相機(jī)與錄音,去河邊找鬼咖楣。 笑死督笆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱贿。 我是一名探鬼主播娃肿,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼珠十!你這毒婦竟也來了料扰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宵睦,失蹤者是張志新(化名)和其女友劉穎记罚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壳嚎,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桐智,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烟馅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片说庭。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖郑趁,靈堂內(nèi)的尸體忽然破棺而出刊驴,到底是詐尸還是另有隱情,我是刑警寧澤寡润,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布捆憎,位于F島的核電站,受9級特大地震影響梭纹,放射性物質(zhì)發(fā)生泄漏躲惰。R本人自食惡果不足惜变抽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一础拨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诡宗,春花似錦、人聲如沸塔沃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芳悲。三九已至,卻和暖如春名扛,著一層夾襖步出監(jiān)牢的瞬間茧痒,已是汗流浹背肮韧。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺订,地道東北人弄企。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像区拳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子樱调,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • This chapter covers the basic setup for using this librar...
    ngugg閱讀 1,010評論 0 1
  • 最近公司項(xiàng)目中要加一個(gè)折線圖的需求因?yàn)槭墙鹑陧?xiàng)目考慮到后期可能會有大量的餅狀和折線圖的需求笆凌,仔細(xì)搜索一番覺得用個(gè)成...
    約翰丶碼農(nóng)閱讀 19,179評論 10 24
  • 一、下載Charts后可以到里面的內(nèi)容 將下載后解壓后的整個(gè)文件夾復(fù)制到工程里 但是只導(dǎo)入 工程Charts.xc...
    浪周周_f157閱讀 1,098評論 0 1
  • 最近做項(xiàng)目需要畫K線圖和折線圖乞而,引入了第三方的圖標(biāo)庫Charts。 這個(gè)圖表庫基本上能夠滿足大家對于圖表繪制的...
    f62385835449閱讀 29,789評論 38 39
  • 8. Setting Colors Since release v1.4.0, the ColorTemplate...
    ngugg閱讀 711評論 0 0