如何反转CGContextClip()

时间:2016-04-13 15:31:12

标签: ios swift core-graphics

我想反转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)

我得到了这个: enter image description here

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

2 个答案:

答案 0 :(得分:2)

此代码不会剪切任何内容

它只是用黑色填补你的道路。在绘制图像之前,您需要致电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)

enter image description here

如果你仍然需要倒数,Matt's answer已经让你满意。

边节点

您(大部分时间)在定义变量时不需要明确提供类型信息。让斯威夫特推断它。因此,您可以替换这样的行:

var path: CGMutablePathRef = CGPathCreateMutable()

用这个:

var path = CGPathCreateMutable()

答案 1 :(得分:1)

您可以使用指定不同的填充模式(偶数 - 奇数)并使用外部路径以及主(内部)路径,它可以为您提供所需的内容。以下是一些可能有用的其他详细信息:Drawing Hollow circle in iPhone