使用贝塞尔曲线画饼图

作者: 芝麻绿豆 | 来源:发表于2016-02-18 00:08 被阅读663次

    没什么好说的上代码吧!

    利用代理和数据源,让用户设置数据和半径及相应的颜色;在相应的控制器内实现代理方法和数据源方法
    @protocol CrlViewDelegate <NSObject>
    - (CGFloat)centerCircleRadius;
    
    @end
    
    @protocol CrlViewDataSource <NSObject>
    @required
    - (int)numberOfSlicesInPieChartView:(crlView *)pieChartView;
    - (double)pieChartView:(crlView *)pieChartView valueForSliceAtIndex:(NSUInteger)index;
    - (UIColor *)pieChartView:(crlView *)pieChartView colorForSliceAtIndex:(NSUInteger)index;
    @optional
    - (NSString*)pieChartView:(crlView *)pieChartView titleForSliceAtIndex:(NSUInteger)index;
    
    @end
    
    在- (void)drawRect:(CGRect)rect方法内绘图;
        
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGFloat theHalf = rect.size.width/2;
        CGFloat lineWidth = theHalf;
        lineWidth -= [self.delegate centerCircleRadius];
        CGFloat radius = theHalf-lineWidth/2;
        
        /*圆心坐标*/
        CGPoint center = CGPointMake(theHalf, rect.size.height/2);
        
        float startAngle = - M_PI_2;
        float endAngle = 0.0f;
        
        double sum = 0.0f;
        /*饼状图中切片个数*/
        int slicesCount = [self.datasource numberOfSlicesInPieChartView:self];
    
        for (int i = 0; i < slicesCount; i++) {
            sum += [self.datasource pieChartView:self valueForSliceAtIndex:i];
        }
        for (int i = 0; i < slicesCount; i ++) {
            static double blckAngle = 0.0f;
            double nextAngle = [self.datasource pieChartView:self valueForSliceAtIndex:i] * (2 * M_PI)/ sum;
            UIColor *fillColor = [self.datasource pieChartView:self colorForSliceAtIndex:i];
            NSString *title;
            if ([self.datasource respondsToSelector:@selector(pieChartView:titleForSliceAtIndex:)]) {
                 title = [self.datasource pieChartView:self titleForSliceAtIndex:i];
            }
            UIBezierPath *path;
            if (i == 0) {
                
                path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:nextAngle clockwise:YES];
                [fillColor setFill];
            }
            else if(i == slicesCount - 1){
            
                path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:nextAngle endAngle:endAngle clockwise:YES];
            }
            else{
            
                path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:blckAngle endAngle:nextAngle clockwise:YES];
            }
    
            blckAngle = nextAngle;
            [path addLineToPoint:center];
            [path closePath];
            [fillColor setFill];
            CGContextAddPath(context, path.CGPath);
            CGContextDrawPath(context, kCGPathFillStroke);
        }
    
    效果图

    可以在下方添加一下说明绘制上去;

    相关文章

      网友评论

      本文标题:使用贝塞尔曲线画饼图

      本文链接:https://www.haomeiwen.com/subject/bfymkttx.html