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

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


8390251284.gif

下載YJGraph文件拖入工程后

1、導入頭文件

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

2、給定一個存儲YJCoordinateItem對象數組

   NSMutableArray *coordiantes = [NSMutableArray array];
   //x軸數據
   NSArray *xText = @[@"第一天",@"第二天",@"第三天",@"第四天",@"第五天",@"第六天",@"第七天"];
   //y軸數據
   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、創建曲線圖

   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];

實現繪圖的核心代碼:

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

#pragma mark - 1繪制坐標軸

- (void)drawCoordinate:(CGContextRef)context
{
    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;
    //繪制坐標框
    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];
    
    //創建一個段落
    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坐標
    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

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

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

推薦閱讀更多精彩內容