2016-08-14 2 views
0

私はNSCollectionViewをサブクラス化し、マウスダウンイベントとマウスイベントを聞きました。コレクションビューの中でマウスをクリックするたびに線を描きたい。NSCollectionViewの内部でbezierPathを描画する方法は?

これは私の描画コードブロックです。私はdraw(_ dirtyRect: NSRect)でこのメソッドを呼び出す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() 
} 

時にアプリをロードアップ、それは正しく行を示しています。しかし、マウスがクリックされたときにのみ、それは描画するために、私はmouseDown(with event: NSEvent)メソッドにそれを移動:

override func mouseDown(with event: NSEvent) { 
    func drawLine() 
} 

しかし、コレクションビューのIマウスクリックは、私は次のエラーを取得する場合:

: 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をサブクラス化し、NSViewaddTrackingArea()に追加しました。現在選択されているアイテムを渡すデリゲートを設定しました。

私は上記のようなエラーを取得しないようにNSCollectionView内の私の描画コードを置くべき場所を知る助けを必要としています。

答えて

1

イエップ、

このようにすることはできません。

何をしたいだろうことは次のとおりです。

  • は、あなたのクラスで、あなたのdraw:mouseUp:

  • mouseDown:にし、に渡すブール値を追加します。あなたが線を描くべきかどうかを知るために、そのブールを確認してください。

  • mouseUp:mouseDown:では、ブール値を設定した後、self.setNeedDisplay()が(それはあなたのためのコンテキストを準備し、自動的に描画呼びます。)を呼び出す

ポイントは次のとおりです。あなたが自分でdraw:を呼び出すことはできません。あなたが描画しているときに、あなたはGraphic Contextの中に描画しており、それはあなたのために配置されなければなりません。

+0

偉大な、ちょうど私が必要な情報。 :) – jyet

関連する問題