iOS:CoreGraphics-使用CGContextClip和lineCap=.Round剪裁圆弧

iOS:CoreGraphics-使用CGContextClip和lineCap=.Round剪裁圆弧,ios,swift,core-graphics,Ios,Swift,Core Graphics,我有一条弧,我画的如下: func drawBackgroundMask(context: CGContextRef, center: CGPoint, radius: CGFloat, lineWidth: CGFloat, startAngle: CGFloat,

我有一条弧,我画的如下:

    func drawBackgroundMask(context: CGContextRef,
                        center: CGPoint,
                        radius: CGFloat,
                        lineWidth: CGFloat,
                        startAngle: CGFloat,
                        endAngle: CGFloat) {
    let adjustedRadius: CGFloat = radius - (lineWidth/2) - 0

    CGContextSetLineWidth(context, lineWidth)
    CGContextSetLineCap(context, .Round)

    CGContextAddArc(context,
                    center.x,
                    center.y,
                    adjustedRadius,
                    startAngle,
                    endAngle,
                    0)

    //CGContextClosePath(context)
    //CGContextClip(context)
    CGContextStrokePath(context)

}
在注释掉上述行后,我可以创建以下内容:

但是,如果我尝试使用绘制的形状作为遮罩,取消上面两行代码的注释,然后将背景绘制为实体,则会得到不同的结果:

    func drawBackgroundMask(context: CGContextRef,
                        center: CGPoint,
                        radius: CGFloat,
                        lineWidth: CGFloat,
                        startAngle: CGFloat,
                        endAngle: CGFloat) {
    let adjustedRadius: CGFloat = radius - (lineWidth/2) - 0

    CGContextSetLineWidth(context, lineWidth)
    CGContextSetLineCap(context, .Round)

    CGContextAddArc(context,
                    center.x,
                    center.y,
                    adjustedRadius,
                    startAngle,
                    endAngle,
                    0)

    CGContextClosePath(context)
    CGContextClip(context)
    CGContextStrokePath(context)

    CGContextSetRGBFillColor(context, 100.0/255.0, 100.0/255.0, 100.0/255.0, 1.0);
    CGContextFillRect(context, rect);
}


有人能向我解释一下为什么使用绘制的圆弧作为剪切遮罩会导致对它的处理与绘制的不同吗?另外,有人能告诉我正确的方法来创建一个圆弧形状的面具与圆形结束?这个问题是我正在处理的一个更大控件的一部分,我必须用弧形显示的形状剪辑另一个弧形。

在第二个示例中,剪辑只考虑弧形的路径。各种笔划参数(如线宽、笔划上限等)仅在实际笔划路径时使用,而您没有这样做

首先在
CGContext
中设置一条路径,然后剪裁它。随后将使用上下文中的路径。正如上面所说:

确定新剪辑路径后,函数将上下文的当前路径重置为空路径

因此,当您调用
CGContextStrokePath
时,它没有效果,因为此时
CGContext
中的当前路径为空

听起来你想在剪辑之前使用它。文档甚至提到了这个确切的用例:

例如,通过调用此函数,然后调用函数CGContextClip,可以剪辑到路径的笔划版本


谢谢,这太有用了!这可能对其他人有所帮助:对于希望继续在图形上下文上执行更多“未剪辑”操作的人,请使用
context.resetClip()
func drawBackgroundMask(context: CGContextRef,
                    center: CGPoint,
                    radius: CGFloat,
                    lineWidth: CGFloat,
                    startAngle: CGFloat,
                    endAngle: CGFloat) {
    let adjustedRadius: CGFloat = radius - (lineWidth/2) - 0

    CGContextSetLineWidth(context, lineWidth)
    CGContextSetLineCap(context, .Round)

    CGContextAddArc(context,
                    center.x,
                    center.y,
                    adjustedRadius,
                    startAngle,
                    endAngle,
                    0)

    CGContextReplacePathWithStrokedPath(context)
    CGContextClip(context)

    CGContextSetRGBFillColor(context, 100.0/255.0, 100.0/255.0, 100.0/255.0, 1.0);
    CGContextFillRect(context, rect);
}