在iPhone中绘制空心圆

时间:2011-05-02 11:54:50

标签: iphone cgcontext geometry

我需要绘制以下图像enter image description here

灰色部分是我想在另一个图像上绘制我需要使用CGContext方法使用的代码,我尝试使用CGContextAddArc但是失败了因为当我填充笔划时,中心凹陷也填充了灰色纹理

任何帮助表示感谢。

信息:我有完整的蓝色图像,我需要在蓝色图像上方添加半圆

由于

3 个答案:

答案 0 :(得分:25)

在Core Graphics文档中查看Filling a Path。基本上,您所做的是在路径(外部和内部)中添加两个弧,然后使用Core Graphics填充规则。代码看起来像这样:

CGMutablePathRef path = CGPathCreateMutable();

// Add the outer arc to the path (as if you wanted to fill the entire circle)
CGPathMoveToPoint(path, ...);
CGPathAddArc(path, ...);
CGPathCloseSubpath(path);

// Add the inner arc to the path (later used to substract the inner area)
CGPathMoveToPoint(path, ...);
CGPathAddArc(path, ...);
CGPathCloseSubpath(path);

// Add the path to the context
CGContextAddPath(context, path);

// Fill the path using the even-odd fill rule
CGContextEOFillPath(context);

CGPathRelease(path);

答案 1 :(得分:10)

进一步研究他的答案和修改中提到的Ole Begemann,我能够达到要求。

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor colorWithPatternImage:[UIImage imageNamed:@"background_grey_pattern.png"]].CGColor);
CGMutablePathRef path = CGPathCreateMutable();
CGContextSetLineWidth(context, 40);
CGPathAddArc(path, NULL, aRect.size.width/2, aRect.size.height/2, 45, 0*3.142/180, angle*3.142/180, 0);
CGContextAddPath(context, path);
CGContextStrokePath(context);
CGPathRelease(path);

因此,我只使用了一个弧线来代替2个弧线,并以更高的宽度抚摸它。

答案 2 :(得分:4)

这是切向但有点相关。这是我的Swift绘图代码,用于圆环(或空心圆)。

class func drawDonut(donutColor: UIColor, rect: CGRect, innerDonutProportion: CGFloat) {

    //// Variable Declarations
    let innerDonutSide: CGFloat = rect.size.width * innerDonutProportion
    let innerDonutOffset: CGFloat = 0.5 * (rect.size.width - innerDonutSide)
    let innerDonutRect = CGRectMake(innerDonutOffset, innerDonutOffset, innerDonutSide, innerDonutSide)

    //// InnerCircle Drawing
    let innerCirclePath = UIBezierPath(ovalInRect: innerDonutRect)

    //// Outer Circle Drawing
    let outerCirclePath = UIBezierPath(ovalInRect: rect)

    // Clip out the innerCirclePath
    outerCirclePath.appendPath(innerCirclePath)
    outerCirclePath.addClip()
    outerCirclePath.usesEvenOddFillRule = true;

    // and Fill the outerCircle
    donutColor.setFill()
    outerCirclePath.fill()
}