如何反转 CGContextClip()

How to invert CGContextClip()

我想反转 CGContextClip() 所以用这个代码:

    let startPoint: CGFloat = CGFloat(degreesToRadians(270))
    let endPoint: CGFloat = CGFloat(degreesToRadians(0))

    var path: CGMutablePathRef = CGPathCreateMutable()
    CGPathAddArc(path, nil, CGFloat(self.frame.size.width / 2.0), CGFloat(self.frame.size.height / 2.0), 155, startPoint, endPoint, false)
    CGPathAddArc(path, nil, CGFloat(self.frame.size.width / 2.0), CGFloat(self.frame.size.height / 2.0), 84, endPoint, startPoint, true)
    CGContextAddPath(ctx, path)

    CGContextDrawImage(ctx, CGPathGetBoundingBox(path), image.CGImage)
    CGContextFillPath(ctx)
    CGContextClosePath(ctx)
    CGContextClip(ctx)

我明白了:

是否可以反转裁剪区域以在我的行内获取图像?

您可以使用指定不同的填充模式(偶数-奇数)并使用外部路径以及您的主要(内部)路径,这应该会为您提供您正在寻找的内容。以下是一些可能有帮助的其他详细信息:Drawing Hollow circle in iPhone

这段代码没有剪裁任何东西

它只是用黑色填充你的路径。您需要在绘制图像之前CGContextClip 调用。这本身应该可以达到您想要的效果(在 弧形区域内 屏蔽图像)。

此外,CGContextClosePath 应该在 之前被调用,然后 将您的路径添加到上下文中。如果你只是掩蔽,你不应该需要调用 CGContextFillPath.

像这样应该可以达到你想要的效果:

let startPoint = -CGFloat(M_PI)*0.5
let endPoint = CGFloat(0)

let ctx = UIGraphicsGetCurrentContext()

let path = CGPathCreateMutable()
CGPathAddArc(path, nil, frame.size.width / 2.0, frame.size.height / 2.0, 155, startPoint, endPoint, false)
CGPathAddArc(path, nil, frame.size.width / 2.0, frame.size.height / 2.0, 84, endPoint, startPoint, true)
CGContextClosePath(ctx)
CGContextAddPath(ctx, path)
CGContextClip(ctx)

CGContextDrawImage(ctx, CGPathGetBoundingBox(path), image.CGImage)

如果您还需要逆运算, 已经满足您的要求。


侧节点

您(大多数时候)不需要在定义变量时显式提供类型信息。让Swift推断一下。因此,您可以像这样替换行:

var path: CGMutablePathRef = CGPathCreateMutable()

有了这个:

var path = CGPathCreateMutable()