我已将 NSCollectionView
子类化以监听鼠标按下和鼠标事件。每当在 Collection View 中单击鼠标时,我想画一条线。
这是我的绘图代码块。
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()
}
但是当我用鼠标点击 Collection View 时,出现以下错误:
: CGContextSetStrokeColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. : CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
我的目标是在鼠标点击时从 collectionViewItem 的中心画一条线到另一个项目,因为我已经将 NSCollectionViewItem
子类化并添加了一个自定义 NSView
到 addTrackingArea ()
。我已经设置了一个传递当前所选项目的委托(delegate)。
我需要帮助来了解我应该将我的绘图代码放在 NSCollectionView
中的什么位置,以免出现上述错误。
最佳答案
是的,
你不能这样做。
你要做的是:
在您的类中添加一个 bool 值,您将在
mouseDown:
中将其传递给 true,在mouseUp 中传递给 false :
在您的
draw:
方法中,检查该 bool 值以了解您是否要画线在
mouseUp:
和mouseDown:
中,设置 bool 值后,调用self.setNeedDisplay()
(这将准备一个上下文并自动调用绘图。)
要点是:您不能自己调用 draw:
。绘图时,您是在图形上下文中绘图,它必须为您布置。
关于objective-c - 如何在 NSCollectionView 中绘制 bezierPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38941824/