Iphone畫餅圖工具類

fmms 12年前發布 | 17K 次閱讀 iPhone iOS開發 移動開發

項目中需要畫餅圖,在此將工具類添出來:

h文件:

    #import <UIKit/UIKit.h>  
    #import <QuartzCore/QuartzCore.h>  


    @interface CLMView : UIView   
    {  

        float spaceHeight; //高度  
        float scaleY ;   
        NSArray *titleArr ; //文字  
        NSArray *valueArr; //值  
        NSArray *colorArr; //顏色  
    }  

    @property(nonatomic, assign)  float spaceHeight;  
    @property(nonatomic, assign) float scaleY;  
    @property(nonatomic, retain) NSArray *titleArr;  
    @property(nonatomic, retain) NSArray *valueArr;  
    @property(nonatomic, retain) NSArray *colorArr;  

    @end  
m文件:
    #import "CLMView.h"  



    #define K_PI 3.1415  
    #define KDGREED(x) ((x)  * K_PI * 2)  


    @implementation CLMView  
    @synthesize spaceHeight, scaleY;  
    @synthesize titleArr, valueArr, colorArr;  


    - (id)initWithFrame:(CGRect)frame {  
        self = [super initWithFrame:frame];  
        if (self) {  
            // Initialization code  
            self.backgroundColor = [UIColor colorWithRed:240.0f/255.0f green:1 blue:1 alpha:1.0];  

            spaceHeight = 40;  
            scaleY = 0.4;  


        }  
        return self;  
    }  


    - (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)  
            {  

                //繪制厚度  
                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);  
            }  

            //只有弧度《 3.14 的才會畫前面的厚度  
            else if(startAngle < K_PI)  
            {  
                endAngle = K_PI;  
                endx = 10;  
                endy1 = 230+spaceHeight;  


                //繪制厚度  
                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);  
            }  

            else  
                //break  
                ;  


            //CGContextSetBlendMode(context, kCGBlendModeMultiply);  







        }  



        //整體漸變  
        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)dealloc {  
        [titleArr release];  
        [valueArr release];  
        [colorArr release];  
        [super dealloc];  
    }  


    @end  
調用:(主要是設置cv的titleArr,valueArr,colorArr)
NSMutableArray *title = [[NSMutableArray alloc]init];  
    NSMutableArray *value = [[NSMutableArray alloc]init];  
    NSMutableArray *color = [[NSMutableArray alloc]init];  
    NSArray *Allcolor = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor blueColor],[UIColor redColor], [UIColor brownColor], [UIColor purpleColor] , [UIColor orangeColor],[UIColor greenColor],[UIColor grayColor],  
        [UIColor colorWithRed:135.0f/255.0f green:206.0f/255.0f blue:235.0f/255.0f alpha:1],  
        [UIColor colorWithRed:240.0f/255.0f green:1 blue:1 alpha:1],  
         [UIColor colorWithRed:1 green:0 blue:1 alpha:1],  
         [UIColor colorWithRed:0 green:199.0f/255.0f blue:140.0f/255.0f alpha:1],  
         [UIColor colorWithRed:160.0f/255.0f green:32.0f/255.0f blue:240.0f/255.0f alpha:1],  
         [UIColor colorWithRed:124.0f/255.0f green:252.0f/255.0f blue:0 alpha:1],  
        nil];  

    for(int i = 0;i<[self.onetableDatacostchat count];i++){  
        float bilv = [[self.onetableDatacostchat objectAtIndex:i] floatValue]/[self.zongcost floatValue];  
        float lastbilv = bilv*100;  

        [title addObject:[NSString stringWithFormat:@"%@     %f%@",[self.onetableDatawenzichat objectAtIndex:i],lastbilv,@"%"]];  


        [value addObject:[NSNumber numberWithInt:lastbilv]];  
        [color addObject:[Allcolor objectAtIndex:i]];  
    }  

    CLMView *cv = [[CLMView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];  

    cv.titleArr = title;  
    cv.valueArr = value;  
    cv.colorArr = color;  

    [self.view addSubview: cv];  
    [cv release];  
    [title release];  
    [value release];  
    [color release];

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!