使用核心图形为iOS绘制空心圆

时间:2015-11-24 19:07:45

标签: ios objective-c core-graphics cgcontext

我正在寻找如何在iOS中使用Core Graphics(CGContext)绘制空心圆的方法。我尝试使用代码来完成它:

- (void)drawRect:(CGRect)rect {
      [super drawRect:rect];
      CGContextRef ctx = UIGraphicsGetCurrentContext();
      CGContextSetLineWidth(ctx, 8.0);
      CGContextSetStrokeColor(ctx, CGColorGetComponents([[UIColor redColor] CGColor]));
      CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor blueColor] CGColor]));
      CGContextFillEllipseInRect(ctx, rect);
      CGContextFillPath(ctx);
}

但它画出了圆圈。 由于此问题已在此处讨论过,但其他示例(例如this)仅为我提供了圆圈。

4 个答案:

答案 0 :(得分:5)

如果你想在rect中绘制一个圆,使用Stroke方法和参数中的rect,你将在rect之外绘制一部分cercle。

假设您知道要绘制的圆的宽度,则有两个选择。

首先,你可以划线,但你必须用较小的矩形绘制它:

-(void)drawRect:(CGRect)rect {

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGFloat innerWidth = 8;
    [[UIColor redColor] setStroke];

    CGContextSetLineWidth(ctx, innerWidth);

    // We add an ellipsis shifted by half the inner Width
    CGContextAddEllipseInRect(ctx, CGRectInset(rect, innerWidth, innerWidth));

    // Stroke the path
    CGContextStrokePath(ctx);
}

您还可以使用奇偶规则(Apple docs

填充圆圈
-(void)drawRect:(CGRect)rect {

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGFloat innerWidth = 8;
    [[UIColor redColor] setStroke];

    // Add the outer circle
    CGContextAddEllipseInRect(ctx, rect);
    // Add the inner circle
    CGContextAddEllipseInRect(ctx, CGRectInset(rect, innerWidth, innerWidth));

    // Fill the path using the EO rule
    CGContextEOFillPath(ctx);
}

答案 1 :(得分:3)

如果您只想要圆形轮廓,请不要填充它。

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ctx, 8.0);
    [[UIColor redColor] set];
    CGContextStrokeEllipseInRect(ctx, rect);
}

答案 2 :(得分:2)

使用CGContextStrokeEllipseInRect代替CGContextFillEllipseInRect。由于您尚未在当前上下文中构建路径,因此请删除CGContextFillPath

答案 3 :(得分:2)

你可以做的一种方法是绘制一个实心圆,然后用CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeClear)

绘制一个稍微小一点的圆圈

在您的代码添加类似

之后
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx, 5.0);
CGContextSetBlendMode(ctx,kCGBlendModeClear)
CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor blueColor] CGColor]));
CGContextFillEllipseInRect(ctx, rect);
CGContextFillPath(ctx);

UIGraphicsEndImageContext();

我在绘图应用程序中使用CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeClear),这可能是更好用的。抚摸这条路可能对你有用。