【问题标题】:How to draw bezierPath inside NSCollectionView?如何在 NSCollectionView 中绘制 bezierPath?
【发布时间】:2016-08-14 11:36:11
【问题描述】:

我对@9​​87654321@ 进行了分类以监听鼠标按下和鼠标事件。每当在集合视图中单击鼠标时,我都想画一条线。

这是我的绘图代码块。

 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 中的哪个位置,以免出现上述错误。

【问题讨论】:

    标签: objective-c swift cocoa


    【解决方案1】:

    是的,

    你不能这样做。

    你要做的是:

    • 在你的类中添加一个布尔值,你将传递给mouseDown:中的truemouseUp:中的false

    • 在您的 draw: 方法中,检查该布尔值以了解您是否要画线

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多