Objective C - 在圆内绘制多个圆弧

时间:2014-07-08 08:45:05

标签: ios objective-c core-graphics

我正在尝试在圆圈内绘制圆弧并填充圆弧。这是我正在使用的代码:

CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextAddEllipseInRect(ctx, rect);
        CGContextSetFillColor(ctx, CGColorGetComponents([[clrArray objectAtIndex:0] CGColor]));
        CGContextFillPath(ctx);

        CGFloat radius = 12.5;

        CGFloat startAngle1 = DegreesToRadians(0);
        CGFloat endAngle1 = DegreesToRadians(135);

        CGFloat startAngle2 = DegreesToRadians(135);
        CGFloat endAngle2 = DegreesToRadians(270);

        //draw arc
        CGPoint center = CGPointMake(radius,radius);

        //Arc 1
        CGContextAddArc(ctx,
                        center.x,
                        center.y,
                        radius,
                        startAngle1,
                        endAngle1,
                        YES);
        [(UIColor*)[clrArray objectAtIndex:1] set];
        CGContextFillPath(ctx);

        //Arc 2
        CGContextAddArc(ctx,
                        center.x,
                        center.y,
                        radius,
                        startAngle2,
                        endAngle2,
                        YES);
        [(UIColor*)[clrArray objectAtIndex:2] set];
        CGContextFillPath(ctx);

这不是正确的。如果我只提供一个弧,那么如果它的角度小于180,那么它也不是正确的。我做错了什么?

编辑:这是正在发生的事情的图像 enter image description here

我在此图像中使用了起始角度0和结束角度

1 个答案:

答案 0 :(得分:0)

使用bezier Path

获得另一种解决方案
CGContextRef ctx = UIGraphicsGetCurrentContext();

        CGFloat radius = 50.0/2.0;
        CGPoint center = CGPointMake(radius,radius);

        CGFloat startAngle1 = DegreesToRadians(0);
        CGFloat endAngle1 = DegreesToRadians(120);

        CGFloat startAngle2 = DegreesToRadians(120);
        CGFloat endAngle2 = DegreesToRadians(240);

        CGContextSaveGState(ctx);

        UIBezierPath* clip1 = [UIBezierPath bezierPathWithArcCenter:center
                                                            radius:radius
                                                        startAngle:startAngle1
                                                          endAngle:endAngle1
                                                         clockwise:YES];
        [clip1 addLineToPoint:center];
        [clip1 closePath];
        [clip1 addClip];

        UIBezierPath *arc1 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 50, 50)];
        [[UIColor blackColor] set];
        [arc1 fill];

        CGContextRestoreGState(ctx);

        CGContextSaveGState(ctx);

        UIBezierPath* clip2 = [UIBezierPath bezierPathWithArcCenter:center
                                                             radius:radius
                                                         startAngle:startAngle2
                                                           endAngle:endAngle2
                                                          clockwise:YES];
        [clip2 addLineToPoint:center];
        [clip2 closePath];
        [clip2 addClip];

        UIBezierPath *arc2 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 50, 50)];
        [[UIColor orangeColor] set];
        [arc2 fill];

        CGContextRestoreGState(ctx);