iOS中圖表要怎么畫

因?yàn)楣臼亲鲆苿?dòng)醫(yī)療APP的,里面會(huì)牽扯到用戶的數(shù)據(jù)問(wèn)題丁恭,關(guān)于用戶每天記錄的數(shù)據(jù)要怎么顯示牲览,這時(shí)就用到了圖表了,有了圖表它可以明了的顯示用戶的數(shù)據(jù)贡必,提高用戶的體驗(yàn)仔拟。
那下面就要說(shuō)這個(gè)圖標(biāo)到底該怎么畫理逊,思路在那里盒揉,要往哪方面想刚盈。

先看下效果圖吧:

屏幕快照 2016-06-03 11.53.04.png

1.思路

該圖表是用上下文,也就是CGContextRef進(jìn)行繪制崭闲,大家可能對(duì)它不是很陌生威蕉,它可以畫一條線韧涨,畫個(gè)正方形,長(zhǎng)方形如孝,圓等娩贷,有很多作用,該文章就是在于怎么通過(guò)這點(diǎn),線腹躁,圓纺非,畫出你需要的表格赘方。

首先你要計(jì)算好窄陡,你要畫多大的圖表,要分成幾個(gè)間隔涂圆,有哪些變量等币叹。

2.主要代碼

先創(chuàng)建一個(gè)類.h里面

typedef enum DrowLineType{
    PointType = 0,
    BrokenType ,
    BezierType,
}DrowLineType;
@interface ZYJ_Draw : UIView
// 數(shù)據(jù)
-(void)setData:(NSMutableArray*)LevelDataArray;
// 獲取繪制類型
@property(assign,nonatomic) DrowLineType * LineType;
//點(diǎn)數(shù)據(jù)的日期
-(void)drawData:(NSMutableArray *)drawDataArray;
//畫點(diǎn)的數(shù)據(jù)
-(void)drawDatacount:(NSMutableArray *)drawDataCountArry;

.m里面踩衩,在這里面,我要分開說(shuō)锚赤,把這個(gè)圖表分成部分來(lái)寫褐鸥。

聲明

#define POINT_CIRCLE  6.0f
@interface ZYJ_Draw()
{
@private
    NSArray * KLevelDataArray;//橫坐標(biāo)數(shù)據(jù)
    NSMutableArray *KdrawDataCountArry;
    NSMutableArray *kdrawDataArray;
    float _width;
    float _height;
    NSMutableArray *SeconArry; //計(jì)算時(shí)間的數(shù)據(jù)
}
@property(nonatomic)float width;
@property(nonatomic)float height;
@end

1.橫線

上下文

// 獲取上下文,進(jìn)行繪制
    CGContextRef ContextRef = UIGraphicsGetCurrentContext();

畫橫線酒贬,橫線是12條

// 線的顏色 橫線
    CGContextSetStrokeColorWithColor(ContextRef, [UIColor lightGrayColor].CGColor);
    for (int i =0 ; i<12; i++) {
        if (i!=0||i!=11) {
             CGContextSetLineWidth(ContextRef, 0.9);
        }

        CGContextMoveToPoint(ContextRef, 0,i*self.frame.size.height/11);
        CGContextAddLineToPoint(ContextRef,self.frame.size.width,(self.frame.size.height/11)*i);
        CGContextStrokePath(ContextRef);
    }

2.豎線

// 設(shè)置線的寬度 豎線
    for (int i= 0; i< 7; i++) {
        if (i==0||i==6) {
            CGFloat lengths[] = {1,1};
            CGContextSetLineDash(ContextRef, 0, lengths, 0);
        }
        else
        {
            CGFloat lengths[] = {3,3};
            CGContextSetLineDash(ContextRef, 0, lengths, 2);
        }
        
        CGContextMoveToPoint(ContextRef, i*self.frame.size.width/6, self.frame.size.height);
        CGContextAddLineToPoint(ContextRef, i*self.frame.size.width/6,0);
        CGContextStrokePath(ContextRef);
    }

到這的話,圖表的大致就好了蠢莺,剩下的x躏将,y軸祸憋,和折線的形成了

3.x軸

// 水平坐標(biāo)的數(shù)據(jù)
    for (int i = 0 ; i<KLevelDataArray.count; i++) {
        float x=self.bounds.size.width/(KLevelDataArray.count-1);
        UILabel * LevelLabel= [[UILabel alloc]initWithFrame:CGRectMake(i*x-20, self.bounds.size.height+5, 40, 10)];
        LevelLabel.textAlignment=NSTextAlignmentCenter;
        LevelLabel.text = KLevelDataArray[i];
        //LevelLabel.backgroundColor=[UIColor redColor];
        LevelLabel.textColor = UIColorFromRGB(0x333333);
        LevelLabel.font = [UIFont systemFontOfSize:12];
        [ self addSubview:LevelLabel];
    }

4.y軸

y軸沒(méi)有寫到這個(gè)類里面掸鹅,寫到了Controller里面

//畫豎直的坐標(biāo)
    for (int i =(int)self.VerticalDataArray.count -1 ; i>=0; i--) {
        UILabel * VerticalDataArrayLabel = [[UILabel alloc]init];
        [drwaBG addSubview:VerticalDataArrayLabel];
       
        float y=i*(430/(self.VerticalDataArray.count+1));
        VerticalDataArrayLabel.textAlignment=NSTextAlignmentCenter;
        [VerticalDataArrayLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(titleLable.mas_bottom).offset(XYZScreenRateIphoneHeight*(20+y));
            make.left.equalTo(drwaBG).offset(XYZScreenRateIphoneWidth*0);
            make.height.equalTo(@(XYZScreenRateIphoneWidth*10));
            make.width.equalTo(@(XYZScreenRateIphoneWidth*30));
        }];
        VerticalDataArrayLabel.font = [UIFont systemFontOfSize:12];
        VerticalDataArrayLabel.text = self.VerticalDataArray[self.VerticalDataArray.count-i-1];
        
    }

5.折線

在畫折線時(shí)巍沙,要確定一個(gè)點(diǎn)x,y坐標(biāo)才能畫點(diǎn)荷鼠,我用的是用測(cè)量時(shí)間確定x坐標(biāo),也就是這個(gè)點(diǎn)距離最左邊的的距離矮嫉,測(cè)量的值確定y軸蠢笋。

確定x坐標(biāo)

如上圖可以看到麸澜,我在畫豎線時(shí),每個(gè)間隔是有一定的寬度编矾,我把它轉(zhuǎn)化分鐘窄俏,下面是該點(diǎn)距離最左邊的寬度,也就是x的位移

 NSString *strtime=SeconArry[i];
        int  j=[strtime intValue];
        float width=j*self.frame.size.width/6/4/60+1.5;

確定y坐標(biāo)

因?yàn)閥坐標(biāo)是變化限寞,它是變化的履植,下面是一個(gè)點(diǎn)的y坐標(biāo)

 if (count>=4.0&&count<=9.0) {
            float height=self.frame.size.height-star-2*star-(count-4)*star-3;
            self.height=height;
            CGContextSetFillColor(ContextRef,  CGColorGetComponents(UIColorFromRGB(0x24b3fa).CGColor));
            
        }

折線代碼

float star=self.frame.size.height/11;
    //畫折線
    CGContextSetStrokeColorWithColor(ContextRef, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(ContextRef, 0.6f);
    NSLog(@"%@",KdrawDataCountArry);
    //CGContextMoveToPoint(ContextRef, 20, 200);
    for (NSInteger i=0; i<KdrawDataCountArry.count; i++) {
        CGContextSetLineDash(ContextRef, 0, 0, 0);
        NSString *strtime=SeconArry[i];
        int  j=[strtime intValue];
        float width=j*self.frame.size.width/6/4/60+1.5;
        NSString *str=KdrawDataCountArry[i];
        float count=[str floatValue];
        
        if (count>=4.0&&count<=9.0) {
            float height=self.frame.size.height-star-2*star-(count-4)*star;
            self.height=height;
        }
        else if (count<4)
        {
            float height=self.frame.size.height-star-count*star/2;
            self.height=height;
        }
        else if(count>9.0&&count<=11.0)
        {
            float height=self.frame.size.height-star-7*star-(count-9)*star/2;
            self.height=height;
            
            
        }
        else if (count>11.0&&count<15.0)
        {
            float height=self.frame.size.height-star-8*star-(count-11.0)*star/4;
            self.height=height;
        }
        else
        {
            float height=self.frame.size.height-star-9*star-(count-15.0)*star/18;
            self.height=height;
        }
        //開始畫線
        if (i==0) {
            CGContextMoveToPoint(ContextRef, width, self.height);
        }
        else
        {
            CGContextAddLineToPoint(ContextRef, width, self.height);
        }
        
    }
    CGContextStrokePath(ContextRef);

6.畫點(diǎn)

畫點(diǎn)和畫折線幾本上是一樣的,下面就是畫點(diǎn)的程序

 // 進(jìn)行繪圖 畫點(diǎn)
    
    for (NSInteger i=0; i<KdrawDataCountArry.count; i++) {
        NSString *strtime=SeconArry[i];
        int  j=[strtime intValue];
        float width=j*self.frame.size.width/6/4/60-1.5;
        NSString *str=KdrawDataCountArry[i];
        float count=[str floatValue];
        if (count>=4.0&&count<=9.0) {
            float height=self.frame.size.height-star-2*star-(count-4)*star-3;
            self.height=height;
            CGContextSetFillColor(ContextRef,  CGColorGetComponents(UIColorFromRGB(0x24b3fa).CGColor));
            
        }
        else if (count>9.0&&count<=11.0)
        {
            float height=self.frame.size.height-star-7*star-(count-9)*star/2;
            self.height=height;
            CGContextSetFillColor(ContextRef,  CGColorGetComponents([UIColor redColor].CGColor));
            
        }
        else if (count>11.0&&count<=15.0)
        {
            float height=self.frame.size.height-star-8*star-(count-11.0)*star/4;
            self.height=height;
            CGContextSetFillColor(ContextRef,  CGColorGetComponents([UIColor redColor].CGColor));
        }
        else if (count>15.0&&count<=33.0)
        {
            float height=self.frame.size.height-star-9*star-(count-15.0)*star/18;
            self.height=height;
            CGContextSetFillColor(ContextRef,  CGColorGetComponents([UIColor redColor].CGColor));
        }
        else
        {
            float height=self.frame.size.height-star-count*star/2;
            self.height=height;
            CGContextSetFillColor(ContextRef,  CGColorGetComponents([UIColor redColor].CGColor));
        }
        
        
       
        CGContextFillEllipseInRect(ContextRef, CGRectMake(width, self.height, 6.0, 6.0));
        
    }

以上就是用上下文畫表格的主要代碼,有沒(méi)有感覺(jué)很簡(jiǎn)單鼻种,其實(shí)一點(diǎn)點(diǎn)的來(lái)的話沙热,也沒(méi)有很難校读,下面是完整的效果圖

屏幕快照 2016-06-03 15.12.47.png

如果有什么疑問(wèn)可以給我留言歉秫,我會(huì)及時(shí)改正。

代碼下載地址https://github.com/zhaoyanjie/ZYJ_DrawViewController.git

網(wǎng)盤 下載地址 http://pan.baidu.com/s/1nvvUgS5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谎碍,隨后出現(xiàn)的幾起案子蟆淀,更是在濱河造成了極大的恐慌,老刑警劉巖熔任,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫匹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兵迅,警方通過(guò)查閱死者的電腦和手機(jī)恍箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門瞧省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)臀突,“玉大人贾漏,你說(shuō)我怎么就攤上這事纵散∥橄疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)把兔。 經(jīng)常有香客問(wèn)我县好,道長(zhǎng),這世上最難降的妖魔是什么翁授? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任收擦,我火速辦了婚禮炬守,結(jié)果婚禮上减途,老公的妹妹穿的比我還像新娘酣藻。我一直安慰自己,他們只是感情好鳍置,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布辽剧。 她就那樣靜靜地躺著,像睡著了一般税产。 火紅的嫁衣襯著肌膚如雪怕轿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天辟拷,我揣著相機(jī)與錄音撞羽,去河邊找鬼。 笑死衫冻,一個(gè)胖子當(dāng)著我的面吹牛诀紊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隅俘,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼蒙畴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼八孝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哥捕,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凫佛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后毫炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弥激,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡职辨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伴鳖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幢炸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闸天,我是刑警寧澤陨享,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布皿桑,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绽慈。R本人自食惡果不足惜谆沃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦肿嘲、人聲如沸匣屡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瓦侮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雌澄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓攒读,卻偏偏與公主長(zhǎng)得像脱盲,于是被迫代替她去往敵國(guó)和親面哥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹲坷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 圖表思維是數(shù)據(jù)分析思維中的最簡(jiǎn)單和最基本的思維兰粉,主要是通過(guò)圖形和表格對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)化焰络。 文字有局限 看到這段話,你會(huì)...
    keeya閱讀 5,643評(píng)論 1 21
  • 一吞获、概述 1. 四線格與基線 小時(shí)候知市,我們?cè)趧傞_始學(xué)習(xí)寫字母時(shí),用的本子是四線格的,我們必須把字母按照規(guī)則寫在四線...
    addapp閱讀 7,625評(píng)論 2 17
  • 轉(zhuǎn)載:http://www.cocoachina.com/swift/20161201/18198.html 前言...
    F麥子閱讀 4,302評(píng)論 2 8
  • 心智良漱,簡(jiǎn)言之母市,就是人們的心理智能,心思智慧的意思蒋失。 在生活中铣卡,心智對(duì)我們的影響遠(yuǎn)超過(guò)我們的想象。我們所有的事情都是...
    大杜915閱讀 1,241評(píng)論 0 1
  • Appearlert_J閱讀 293評(píng)論 0 0