我已经分类NSCollectionView
来收听鼠标按下和鼠标事件。我想在集合视图中单击鼠标时绘制一条线。
这是我的绘图代码块。
public func drawLine() {
//// Bezier Drawing
let bezierPath = NSBezierPath()
bezierPath.move(to: NSMakePoint(50.0, 60.0))
bezierPath.line(to: NSMakePoint(65.5, 72.5))
bezierPath.line(to: NSMakePoint(65.5, 93.5))
bezierPath.line(to: NSMakePoint(97.5, 87.5))
bezierPath.line(to: NSMakePoint(97.5, 56.5))
NSColor.black.setStroke()
bezierPath.lineWidth = 10
bezierPath.stroke()
}
内部NSCollectionView
子类我在draw(_ dirtyRect: NSRect)
中调用此方法,它会在应用加载时正确显示该行。但是要仅在单击鼠标时进行绘制,我将其移至mouseDown(with event: NSEvent)
方法:
override func mouseDown(with event: NSEvent) {
func drawLine()
}
但是当我鼠标点击集合视图时,我收到以下错误:
:CGContextSetStrokeColorWithColor:无效的上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量。 :CGContextSaveGState:无效的上下文0x0。如果你想查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量。
我的目标是在单击鼠标时从collectionViewItem的中心绘制一条线到另一个项目,因为我已经将NSCollectionViewItem
子类化,并为NSView
添加了自定义addTrackingArea()
。我设置了一个传递当前所选项目的委托。
我需要帮助才能知道我应该在NSCollectionView
中放置我的绘图代码,以免得到如上所述的错误。
答案 0 :(得分:1)
是的,
你不能这样做。
您想要做的是:
在您的课程中添加一个布尔值,您将传递给mouseDown:
中的 true 和mouseUp:
中的 false
在您的draw:
方法中,如果要绘制线条,请检查该bool是否知道
在mouseUp:
和mouseDown:
中,在设置布尔值后,调用self.setNeedDisplay()
(将为您准备一个上下文并自动调用绘图。)
重点是:你不能自己打电话给draw:
。在绘图时,你正在绘制一个图形上下文,它必须为你布局。