核心图形裁剪
Core Graphics Clipping
我试图理解 IOS Core Graphics 中的裁剪,但我无法弄清楚一些奇怪的行为。
我要做的是剪出一个小三角形。我从 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)
现在,如果我尝试填充路径,则不会出现任何内容。
此外,如果我尝试将整个子视图矩形添加到当前路径并用红色填充它,我希望除了三角形之外整个区域都是红色的,但结果是这样的:
别的地方画不出来!
有什么想法吗?
您的代码中的错误是: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)
我试图理解 IOS Core Graphics 中的裁剪,但我无法弄清楚一些奇怪的行为。
我要做的是剪出一个小三角形。我从 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)
现在,如果我尝试填充路径,则不会出现任何内容。 此外,如果我尝试将整个子视图矩形添加到当前路径并用红色填充它,我希望除了三角形之外整个区域都是红色的,但结果是这样的:
别的地方画不出来!
有什么想法吗?
您的代码中的错误是: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)