You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除已绘制的填充NSBezierPath(红色圆形)?

如何删除用NSBezierPath绘制的红色圆形?

嘿,我来帮你搞定这个问题~在macOS里用NSBezierPath绘制的图形,其实不是直接“删除”的,而是靠视图的重绘机制来更新显示。下面分几种常见情况给你讲:

情况1:直接在自定义NSView的绘图方法里硬编码绘制

如果你的红色圆形是直接写在draw(_ dirtyRect: NSRect)方法里的,那最简单的处理方式就是:

  • 移除或者注释掉那段绘制圆形的代码
  • 调用视图的setNeedsDisplay(true)方法触发重绘,让视图更新成新的状态

举个例子,原来的代码可能是这样的:

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
    
    // 原来绘制红色圆形的代码
    let circlePath = NSBezierPath(ovalIn: NSRect(x: 50, y: 50, width: 100, height: 100))
    NSColor.red.setFill()
    circlePath.fill()
}

现在把这段绘制代码删掉/注释,然后在需要清除圆形的地方调用:

yourCustomView.setNeedsDisplay(true)

情况2:需要动态控制圆形的显示/隐藏(更推荐)

如果以后还要切换显示这个圆形,建议用一个状态变量来控制绘制逻辑,步骤如下:

  1. 在自定义NSView类里加一个布尔型状态变量,比如var shouldShowCircle = true
  2. 在绘图方法里根据这个变量决定是否绘制圆形
  3. 要删除圆形时,把变量设为false并触发重绘

代码示例:

class CustomCircleView: NSView {
    // 控制圆形显示的状态变量
    var shouldShowCircle = true
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        
        // 只有当状态为true时才绘制圆形
        guard shouldShowCircle else { return }
        
        let circlePath = NSBezierPath(ovalIn: NSRect(x: 50, y: 50, width: 100, height: 100))
        NSColor.red.setFill()
        circlePath.fill()
    }
}

当你需要删除圆形时,执行这段代码:

// 假设你有一个CustomCircleView的实例叫circleView
circleView.shouldShowCircle = false
circleView.setNeedsDisplay(true)

补充说明

默认情况下,调用super.draw(dirtyRect)会自动填充视图的背景,所以重绘后之前的圆形会被背景覆盖掉,也就看不到了。如果你的视图背景是透明的,可能需要手动填充背景色来清除旧图形,比如在draw方法开头加一句:

NSColor.white.setFill() // 换成你需要的背景色
bounds.fill()

内容的提问来源于stack exchange,提问作者Devid Otladka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:02:39