ios - 核心显卡裁剪

标签 ios swift core-graphics quartz-2d

我试图理解 IOS 核心图形中的裁剪,但我无法找出一些奇怪的行为。

我想做的是剪出一个小三角形。我从 UIView 创建了一个 subview ,并重写了 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)

现在,如果我尝试填充路径,则不会出现任何内容。 此外,如果我尝试将整个 subview 矩形添加到当前路径并用红色填充它,我会期望除三角形之外的整个区域都是红色的,但结果是这样的:

enter image description here

我不能在其他地方画画!

有什么想法吗?

最佳答案

代码中的错误是:con.addRect(con.boundingBoxOfPath)。矩形 boundingBoxOfPath 与此任务无关。如果您希望能够在 View 中除三角形之外的任何位置进行绘制,则需要将完整 View 矩形添加到剪切路径中。换句话说,将该行更改为: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 - 核心显卡裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486479/

相关文章:

ios - 方法 decidePolicyForNavigationAction 从未调用过,WKWebView Swift

iphone - 如何在iPhone上录制用户生成的声音输出

swift - 在 Spritekit 中触摸开始时重复背景

ios - SwiftValidator - OnValidationSuccessful

ios - 当 String 不符合错误时抛出的函数命中 do catch block 时如何获得正确的错误?

iphone - 沿任一轴翻转 UIImage

ios - 重绘时未清除 UIBezierPath

iOS,打开一个推送通知,其他的也不见了

ios - 本地通知设置特定的开火日期

cocoa - 部分用户绘制 NSWindow 时出现 CGContextSetCompositeOperation 错误