我已经将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/

10-12 00:15