Ios 核心图形剪辑

Ios 核心图形剪辑,ios,swift,core-graphics,core,quartz-2d,Ios,Swift,Core Graphics,Core,Quartz 2d,我试图理解IOS内核图形中的剪辑,但我无法理解一些奇怪的行为 我想做的是剪出一个小三角形。我从UIView创建了一个子视图,并重写了draw(rect)函数 使用此代码,我绘制三角形: let con = UIGraphicsGetCurrentContext()! con.setFillColor(UIColor.red.cgColor) con.move(to: CGPoint(x: rect.midX - 10, y: rect.maxY - 10)) c

我试图理解IOS内核图形中的剪辑,但我无法理解一些奇怪的行为

我想做的是剪出一个小三角形。我从UIView创建了一个子视图,并重写了draw(rect)函数

使用此代码,我绘制三角形:

    let con = UIGraphicsGetCurrentContext()!

    con.setFillColor(UIColor.red.cgColor)
    con.move(to: CGPoint(x: rect.midX - 10, y: rect.maxY - 10))
    con.addLine(to: CGPoint(x: rect.midX, y: rect.maxY - 20 ))
    con.addLine(to: CGPoint(x: rect.midX + 10, y: rect.maxY - 10 ))
    con.closePath()
    con.addRect(con.boundingBoxOfPath)
    con.clip(using: .evenOdd)
之后,我取了路径周围的矩形并剪裁了三角形:

    let con = UIGraphicsGetCurrentContext()!

    con.setFillColor(UIColor.red.cgColor)
    con.move(to: CGPoint(x: rect.midX - 10, y: rect.maxY - 10))
    con.addLine(to: CGPoint(x: rect.midX, y: rect.maxY - 20 ))
    con.addLine(to: CGPoint(x: rect.midX + 10, y: rect.maxY - 10 ))
    con.closePath()
    con.addRect(con.boundingBoxOfPath)
    con.clip(using: .evenOdd)
现在,如果我尝试填充路径,则不会显示任何内容。 此外,如果我尝试将整个子视图矩形添加到当前路径,并用红色填充它,我希望整个区域都是红色,三角形除外,但结果如下:

我不能在别的地方画画


有什么想法吗?

代码中的错误是:
con.addRect(con.boundingBoxOfPath)
。路径的矩形
boundingBoxOfPath
与此任务无关。如果希望能够绘制视图中除三角形以外的任何位置,则需要将完整视图矩形添加到剪裁路径中。换句话说,将该行更改为:
con.addRect(rect)

以下代码适用于我:

guard let ctx = UIGraphicsGetCurrentContext() else { return }

ctx.beginPath()
ctx.move(to: CGPoint(x: rect.midX - 10, y: rect.midY - 10))
ctx.addLine(to: CGPoint(x: rect.midX, y: rect.midY - 20 ))
ctx.addLine(to: CGPoint(x: rect.midX + 10, y: rect.midY - 10 ))
ctx.closePath()

ctx.addRect(rect)
ctx.clip(using: .evenOdd)

// Test filling the view (except triangle) with red:
ctx.setFillColor(UIColor.red.cgColor)
ctx.fill(rect)