如何在NSCollectionView中绘制bezierPath?

时间:2016-08-14 11:36:11

标签: objective-c swift cocoa

我已经分类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中放置我的绘图代码,以免得到如上所述的错误。

1 个答案:

答案 0 :(得分:1)

是的,

你不能这样做。

您想要做的是:

  • 在您的课程中添加一个布尔值,您将传递给mouseDown:中的 true mouseUp:中的 false

  • 在您的draw:方法中,如果要绘制线条,请检查该bool是否知道

  • mouseUp:mouseDown:中,在设置布尔值后,调用self.setNeedDisplay()(将为您准备一个上下文并自动调用绘图。)

重点是:你不能自己打电话给draw:。在绘图时,你正在绘制一个图形上下文,它必须为你布局。