如何删除已绘制的填充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:需要动态控制圆形的显示/隐藏(更推荐)
如果以后还要切换显示这个圆形,建议用一个状态变量来控制绘制逻辑,步骤如下:
- 在自定义NSView类里加一个布尔型状态变量,比如
var shouldShowCircle = true - 在绘图方法里根据这个变量决定是否绘制圆形
- 要删除圆形时,把变量设为
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
相关产品推荐
相关产品推荐

