我已经将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)
方法:override func mouseDown(with event: NSEvent) {
func drawLine()
}
但是,当我鼠标单击collection视图时,会出现以下错误:
:CGContextSetStrokeColorWithColor:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
:CGContextSaveGState:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
我的目标是在鼠标单击时从collectionViewItem的中心画一条线到另一个item,为此我已经将
mouseDown(with event: NSEvent)
子类化,并向NSCollectionViewItem
添加了一个自定义的NSView
。我设置了一个传递当前选定项的委托。我需要帮助来知道我应该把我的绘图代码放在
addTrackingArea()
中的什么位置,以避免出现上面这样的错误。 最佳答案
是的,
你不能这样做。
你要做的是:
在类中添加一个布尔值,在mouseDown:
中传递给true,在mouseUp:
中传递给false
在您的draw:
方法中,检查bool to know是否要画线
在mouseUp:
和mouseDown:
中,设置布尔值后,调用self.setNeedDisplay()
(这将为您准备一个上下文并自动调用draw)
要点是:您不能单独调用draw:
。当你在绘图时,你是在一个图形环境中绘图,它必须为你布局。
关于objective-c - 如何在NSCollectionView内绘制bezierPath?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38941824/