繪制曲線圖/折線圖只需4步

繪制曲線圖/折線圖只需4步


8390251284.gif

下載YJGraph文件拖入工程后

1旁舰、導(dǎo)入頭文件

    #import "YJGraphView.h"
    #import "YJCoordinateItem.h"

2、給定一個存儲YJCoordinateItem對象數(shù)組

   NSMutableArray *coordiantes = [NSMutableArray array];
   //x軸數(shù)據(jù)
   NSArray *xText = @[@"第一天",@"第二天",@"第三天",@"第四天",@"第五天",@"第六天",@"第七天"];
   //y軸數(shù)據(jù)
   NSArray *yValue = @[@"50",@"66",@"30",@"100",@"72",@"85",@"45"];
   for (NSInteger i = 0; i < 7; i++)
   {
   YJCoordinateItem *item = [YJCoordinateItem coordinateItemWithXText:xText[i]
yValue:[yValue[i] integerValue] ];
   [coordiantes addObject:item];
   }

3芥丧、創(chuàng)建曲線圖

   YJGraphView *graphView = [[YJGraphView alloc]       initWithCoordiantes:coordiantes
   graphColor:[UIColor redColor]
   animated:YES];
   graphView.frame = CGRectMake(0, 100, self.view.frame.size.width, 300);
   [self.view addSubview:graphView];

4擅耽、開始繪制

 [graphView stroke];

實現(xiàn)繪圖的核心代碼:

 //在  drawRect 中進(jìn)行繪圖
- (void)drawRect:(CGRect)rect
{
    //建立繪圖 顏色 線寬
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [[UIColor lightGrayColor] CGColor]);
    CGContextSetLineWidth(context, kCoordinateLineWitdth);
    
    //1询兴、繪制坐標(biāo)軸
    [self drawCoordinate:context];
    //2警儒、繪制X軸文字
    [self drawXCoordinateText];
    //3、繪制Y軸文字
    [self drawYCoordinateText];
    //4、繪制曲線圖
    [self drawGraph];
}

#pragma mark - 1繪制坐標(biāo)軸

- (void)drawCoordinate:(CGContextRef)context
{
    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;
    //繪制坐標(biāo)框
    CGContextAddRect(context, CGRectMake(kEdgeInsertSpace, kEdgeInsertSpace, width - 2 * kEdgeInsertSpace, height - 2 * kEdgeInsertSpace));
    CGContextStrokePath(context);
    
    //繪制虛線框
    CGFloat lenths[1] = {5};
    CGContextSetLineDash(context, 0, lenths, sizeof(lenths)/sizeof(lenths[0]));
      //行高
    CGFloat rowHeight = [self rowHeight];
    for (int i = 0; i < kNumberOfRow; i++) {
        CGFloat y = kEdgeInsertSpace + rowHeight * i;
        CGContextMoveToPoint(context, kEdgeInsertSpace, y);
        CGContextAddLineToPoint(context, kEdgeInsertSpace, y);
        CGContextStrokePath(context);
    }
    
}

#pragma mark - 2繪制X軸文字

- (void)drawXCoordinateText
{
    for (int i = 0; i < _coordinates.count; i++) {
        YJCoordinateItem *item = _coordinates[i];
        //獲取文字的寬度
        CGFloat textWidth = [item.xValue sizeWithFontSize:kFontSize maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)].width;
        //繪制點
        CGPoint point = CGPointMake(kXSpace - textWidth / 2 + kEdgeInsertSpace + kDistanceBetweenPointAndPoit * i, self.frame.size.height - kEdgeInsertSpace);
        
        [item.xValue drawAtPoint:point withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:kFontSize]}];
    }
}

#pragma mark - 3繪制Y軸文字

- (void)drawYCoordinateText
{
    CGFloat maxY = [self maxYOfCoodinateYValue];
    CGFloat rowHeight = [self rowHeight];
    
    //創(chuàng)建一個段落
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.alignment = NSTextAlignmentRight;
    
    for (int i = 0; i < kNumberOfRow; i++) {
        NSString *text = [NSString stringWithFormat:@"%.0f",maxY - maxY/kNumberOfRow * i];
        //獲取文字的高度
        CGFloat textHeight = [text sizeWithFontSize:kFontSize maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)].height;
        //繪圖
        [text drawInRect:CGRectMake(0, kEdgeInsertSpace + rowHeight * i - textHeight / 2, kEdgeInsertSpace - 5, rowHeight) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:kFontSize],NSParagraphStyleAttributeName:paragraph}];
    }
    
}

#pragma mark - 4繪制曲線圖 及 動畫

- (void)drawGraph
{
    //x,y坐標(biāo)
    CGFloat startX,startY;
    CGFloat x,y;
    
    CGFloat maxY = [self maxYOfCoodinateYValue];
    CGFloat coordinateHeight = self.frame.size.height - 2 * kEdgeInsertSpace;
    
    //繪制圖
    CGMutablePathRef graphPath = CGPathCreateMutable();
    
    
    for (int i = 0; i < _coordinates.count; i++) {
        YJCoordinateItem *item = _coordinates[i];
        CGFloat scale = item.yValue / maxY;
        
        x = kEdgeInsertSpace + kXSpace + kDistanceBetweenPointAndPoit * i;
        y = kEdgeInsertSpace + (1 - scale) * coordinateHeight;
        if (i == 0) {
            startX = x;
            startY = y;
            //CGPathMoveToPoint(graphPath, NULL, kEdgeInsertSpace,self.frame.size.height - kEdgeInsertSpace);
            CGPathMoveToPoint(graphPath, NULL, x, y);
        }else{
        CGPathAddLineToPoint(graphPath, NULL, x, y);
        }
        
        
    }
    
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.strokeColor = [UIColor kGraphColor].CGColor;
    //線條的寬度
    layer.lineWidth = kCoordinateLineWitdth;
    layer.lineCap = kCALineCapRound;
    layer.path = graphPath;
    
    
    [self.layer addSublayer:layer];
    
    if (_animation) {
        CABasicAnimation *animation = [ CABasicAnimation animationWithKeyPath : NSStringFromSelector ( @selector (strokeEnd))];
        
        animation.fromValue = @0 ;
        
        animation.toValue = @1 ;
        
        animation.duration = kAnimationDuration ;
        
        [layer addAnimation :animation forKey : NSStringFromSelector ( @selector (strokeEnd))];
    }
    
    CGPathRelease(graphPath);
}

[YJGraph文件][1]
[1]: https://github.com/CrazerF/YJGraph

如果覺得有用希望點個小星星噢~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厌丑,一起剝皮案震驚了整個濱河市定欧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹄衷,老刑警劉巖忧额,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愧口,居然都是意外死亡睦番,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門耍属,熙熙樓的掌柜王于貴愁眉苦臉地迎上來托嚣,“玉大人,你說我怎么就攤上這事厚骗∈酒簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵领舰,是天一觀的道長夫嗓。 經(jīng)常有香客問我,道長冲秽,這世上最難降的妖魔是什么舍咖? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锉桑,結(jié)果婚禮上排霉,老公的妹妹穿的比我還像新娘。我一直安慰自己民轴,他們只是感情好攻柠,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著后裸,像睡著了一般瑰钮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上微驶,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天飞涂,我揣著相機(jī)與錄音,去河邊找鬼。 笑死较店,一個胖子當(dāng)著我的面吹牛士八,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梁呈,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼婚度,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了官卡?” 一聲冷哼從身側(cè)響起蝗茁,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寻咒,沒想到半個月后哮翘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡毛秘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年饭寺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叫挟。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡艰匙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抹恳,到底是詐尸還是另有隱情员凝,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布奋献,位于F島的核電站健霹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓶蚂。R本人自食惡果不足惜糖埋,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扬跋。 院中可真熱鬧,春花似錦凌节、人聲如沸钦听。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朴上。三九已至,卻和暖如春卒煞,著一層夾襖步出監(jiān)牢的瞬間痪宰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留衣撬,地道東北人乖订。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像具练,于是被迫代替她去往敵國和親乍构。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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

  • 說明: 已將折線圖封裝到了一個UIView子類中扛点,并提供了相應(yīng)的接口哥遮。若你遇到相應(yīng)的需求可以直接將文件拖到項目中,...
    AHLQ閱讀 7,406評論 5 47
  • 折線圖是工作中使用最頻繁的圖表之一陵究,大多數(shù)人對折線圖的認(rèn)識還是非常淺顯的眠饮,接下來,來深入了解一下折線圖铜邮。 一.什么...
    璞石閱讀 13,603評論 0 14
  • 第一 折線圖實現(xiàn) .1) 自定義視圖實現(xiàn) .2)關(guān)鍵技術(shù)實現(xiàn) .3) 方法調(diào)用 .4) 效果展示 第二 走勢曲線圖...
    莊欲以莘閱讀 2,499評論 1 1
  • 今年二月的時候,網(wǎng)絡(luò)上曾出現(xiàn)過一部風(fēng)靡一時的網(wǎng)絡(luò)同性愛情片叫《錯了性別不錯愛》牍鞠,主要講述的是大學(xué)生于筱柔喜歡上同宿...
    陳舒璇閱讀 13,799評論 49 87
  • 1897年咖摹,意大利經(jīng)濟(jì)學(xué)家帕列托在對19世紀(jì)美國社會各階層的財富和收益統(tǒng)計分析時發(fā)現(xiàn);80%社會財富集中在20%的...
    實實在在教語文閱讀 451評論 0 1