ios 用程式繪製餅圖的demo

來源:互聯網
上載者:User

demo功能:用程式繪製餅圖的demo。

demo說明:根據給定的標題數組,數值數組,和顏色數組繪製出一個餅狀圖。主要代碼在:CLMView.m中。

demo截屏:

 

 


demo的主要代碼:繪製部分


[csharp]
- (void)drawRect:(CGRect)rect  

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    //cgcontextsets  
     
    //消除鋸齒  
    CGContextSetAllowsAntialiasing(context, TRUE); 
     
//  int arr[5] = {20, 15, 35, 85 ,60};  
     
    float sum = 0; 
     
     
    for(int j=0;j< [valueArr count]; j++) 
    { 
        sum  += [[valueArr objectAtIndex:j] floatValue]; 
    } 
     
     
    CGContextMoveToPoint(context, 160, 230); 
     
    float currentangel = 0; 
     
    //餅圖  
    CGContextSaveGState(context); 
    CGContextScaleCTM(context, 1.0, scaleY); 
 
    currentangel = 0; 
     
    for(int i = 0; i< [valueArr count]; i++) 
    { 
 
        float startAngle = KDGREED(currentangel); 
         
        currentangel += [[valueArr objectAtIndex:i] floatValue] / sum; 
         
        float endAngle = KDGREED(currentangel); 
         
         
        //繪製上面的扇形  
        CGContextMoveToPoint(context, 160, 230); 
         
        [[colorArr objectAtIndex:i %  [valueArr count]] setFill]; 
         
        [[UIColor colorWithWhite:1.0 alpha:0.8] setStroke]; 
         
        CGContextAddArc(context, 160, 230, 150, startAngle, endAngle, 0); 
         
        CGContextClosePath(context); 
        CGContextDrawPath(context, kCGPathFill); 
         
         
         
        //繪製側面  
        float starx = cos(startAngle) * 150  +160; 
        float stary = sin(startAngle) * 150 + 230; 
         
        float endx = cos(endAngle) * 150 + 160; 
        float endy = sin(endAngle) * 150 + 230; 
         
        //float starty1 = stary + spaceHeight;  
        float endy1 = endy + spaceHeight; 
         
         
        if(endAngle < K_PI) 
        { 
        } 
         
        //只有弧度《 3.14 的才會畫前面的厚度  
        else if(startAngle < K_PI) 
        { 
            endAngle = K_PI; 
            endx = 10; 
            endy1 = 230+spaceHeight; 
        } 
         
        else 
            break; 
          
         
        //CGContextSetBlendMode(context, kCGBlendModeMultiply);  
         
         
        //繪製厚度  
        CGMutablePathRef path = CGPathCreateMutable(); 
        CGPathMoveToPoint(path, nil, starx, stary); 
        CGPathAddArc(path, nil, 160, 230, 150, startAngle, endAngle, 0); 
        CGPathAddLineToPoint(path, nil, endx, endy1); 
         
        CGPathAddArc(path, nil, 160, 230 + spaceHeight, 150, endAngle, startAngle, 1); 
        CGContextAddPath(context, path); 
         
        [[colorArr objectAtIndex:i %  [valueArr count]] setFill]; 
        [[UIColor colorWithWhite:0.9 alpha:1.0] setStroke]; 
         
        CGContextDrawPath(context, kCGPathFill); 
         
        [[UIColor colorWithWhite:0.1 alpha:0.4] setFill]; 
        CGContextAddPath(context, path); 
        CGContextDrawPath(context, kCGPathFill);             
         
 
    } 
     
         
    //整體漸層  
    CGFloat componets [] = {0.0, 0.0, 0.0, 0.5,0.0,0.0,0.0,0.1}; 
     
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
     
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, componets, nil, 2); 
     
    CGContextDrawRadialGradient(context, gradient, CGPointMake(160,230), 0, CGPointMake(160,230), 150, 0 ); 
     
    CFRelease(colorspace); 
    CGGradientRelease(gradient); 
     
     
    CGContextRestoreGState(context); 
     
    //繪製文字  
     
    for(int i = 0; i< [valueArr count]; i++) 
    { 
        float origionx = 50 ; 
        float origiony = i * 30 + 200; 
         
        [[colorArr objectAtIndex:i %  [valueArr count]] setFill]; 
         
        CGContextFillRect(context, CGRectMake(origionx, origiony, 20, 20)); 
        CGContextDrawPath(context, kCGPathFill); 
         
         
        if(i< [titleArr count]) 
        { 
            NSString *title = [ titleArr objectAtIndex:i]; 
            [title drawAtPoint:CGPointMake(origionx + 50, origiony) withFont:[UIFont systemFontOfSize:16]]; 
        } 
         
    } 
     

- (void)drawRect:(CGRect)rect
{
 CGContextRef context = UIGraphicsGetCurrentContext();
 //cgcontextsets
 
 //消除鋸齒
 CGContextSetAllowsAntialiasing(context, TRUE);
 
// int arr[5] = {20, 15, 35, 85 ,60};
 
 float sum = 0;
 
 
 for(int j=0;j< [valueArr count]; j++)
 {
  sum  += [[valueArr objectAtIndex:j] floatValue];
 }
 
 
 CGContextMoveToPoint(context, 160, 230);
 
 float currentangel = 0;
 
 //餅圖
 CGContextSaveGState(context);
 CGContextScaleCTM(context, 1.0, scaleY);

 currentangel = 0;
 
 for(int i = 0; i< [valueArr count]; i++)
 {

  float startAngle = KDGREED(currentangel);
  
  currentangel += [[valueArr objectAtIndex:i] floatValue] / sum;
  
  float endAngle = KDGREED(currentangel);
  
  
  //繪製上面的扇形
  CGContextMoveToPoint(context, 160, 230);
  
  [[colorArr objectAtIndex:i %  [valueArr count]] setFill];
  
  [[UIColor colorWithWhite:1.0 alpha:0.8] setStroke];
  
  CGContextAddArc(context, 160, 230, 150, startAngle, endAngle, 0);
  
  CGContextClosePath(context);
  CGContextDrawPath(context, kCGPathFill);
  
  
  
  //繪製側面
  float starx = cos(startAngle) * 150  +160;
  float stary = sin(startAngle) * 150 + 230;
  
  float endx = cos(endAngle) * 150 + 160;
  float endy = sin(endAngle) * 150 + 230;
  
  //float starty1 = stary + spaceHeight;
  float endy1 = endy + spaceHeight;
  
  
  if(endAngle < K_PI)
  {
  }
  
  //只有弧度《 3.14 的才會畫前面的厚度
  else if(startAngle < K_PI)
  {
   endAngle = K_PI;
   endx = 10;
   endy1 = 230+spaceHeight;
  }
  
  else
   break;
  
  
  //CGContextSetBlendMode(context, kCGBlendModeMultiply);
  
  
  //繪製厚度
  CGMutablePathRef path = CGPathCreateMutable();
  CGPathMoveToPoint(path, nil, starx, stary);
  CGPathAddArc(path, nil, 160, 230, 150, startAngle, endAngle, 0);
  CGPathAddLineToPoint(path, nil, endx, endy1);
  
  CGPathAddArc(path, nil, 160, 230 + spaceHeight, 150, endAngle, startAngle, 1);
  CGContextAddPath(context, path);
  
  [[colorArr objectAtIndex:i %  [valueArr count]] setFill];
  [[UIColor colorWithWhite:0.9 alpha:1.0] setStroke];
  
  CGContextDrawPath(context, kCGPathFill);
  
  [[UIColor colorWithWhite:0.1 alpha:0.4] setFill];
  CGContextAddPath(context, path);
  CGContextDrawPath(context, kCGPathFill);   
  

 }
 
  
 //整體漸層
 CGFloat componets [] = {0.0, 0.0, 0.0, 0.5,0.0,0.0,0.0,0.1};
 
 CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
 
 CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, componets, nil, 2);
 
 CGContextDrawRadialGradient(context, gradient, CGPointMake(160,230), 0, CGPointMake(160,230), 150, 0 );
 
 CFRelease(colorspace);
 CGGradientRelease(gradient);
 
 
 CGContextRestoreGState(context);
 
 //繪製文字
 
 for(int i = 0; i< [valueArr count]; i++)
 {
  float origionx = 50 ;
  float origiony = i * 30 + 200;
  
  [[colorArr objectAtIndex:i %  [valueArr count]] setFill];
  
  CGContextFillRect(context, CGRectMake(origionx, origiony, 20, 20));
  CGContextDrawPath(context, kCGPathFill);
  
  
  if(i< [titleArr count])
  {
   NSString *title = [ titleArr objectAtIndex:i];
   [title drawAtPoint:CGPointMake(origionx + 50, origiony) withFont:[UIFont systemFontOfSize:16]];
  }
  
 }
 
}

 

 


CLMView.m的調用方法:

 


[csharp] 
CLMView *cv = [[CLMView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];//執行個體化    
 
//指定標題數組  
cv.titleArr = [NSArray  arrayWithObjects:@"iphone", @"sybian", @"windowbile", @"mego",@"android",nil]; 
 
//指定數值比例數組  
cv.valueArr = [NSArray arrayWithObjects:[NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],\ 
                   [NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],nil]; 
//指定顏色數組  
cv.colorArr = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor blueColor], [UIColor brownColor], [UIColor purpleColor] , [UIColor orangeColor],nil]; 
     
    [self.view addSubview: cv]; 
    [cv release]; 

CLMView *cv = [[CLMView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];//執行個體化 

//指定標題數組
cv.titleArr = [NSArray arrayWithObjects:@"iphone", @"sybian", @"windowbile", @"mego",@"android",nil];

//指定數值比例數組
cv.valueArr = [NSArray arrayWithObjects:[NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],\
       [NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],nil];
//指定顏色數組
cv.colorArr = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor blueColor], [UIColor brownColor], [UIColor purpleColor] , [UIColor orangeColor],nil];
 
 [self.view addSubview: cv];
 [cv release];

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.