2016-08-09 11 views
2

私はSwiftのMacOS用の小さな描画アプリケーションをCocoaを使って書こうとしています。問題は、NSViewが再度描画されたときに最後に描画された線が消えることです。描画された線を維持する方法はありますか?ポイントを配列に保存することはできますが、パフォーマンスが大幅に低下します。残念ながら、CGContextSaveGState関数はパスを保存しません。私は、CoreGraphicsのステップアウトとNSBezierPathを使用したい、このシナリオでココアのCGContextからのパスを保存

import Cocoa 

class DrawingView: NSView { 
    // Variables 

    var lastPoint = CGPoint.zero 
    var currentPoint = CGPoint.zero 

    var red: CGFloat = 0.0 
    var green: CGFloat = 0.0 
    var blue: CGFloat = 0.0 
    var alpha: CGFloat = 1.0 

    var brushSize: CGFloat = 2.0 

    var dragged = false 

    // Draw function 

    override func drawRect(rect: NSRect) { 
    super.drawRect(rect) 

    let context = NSGraphicsContext.currentContext()?.CGContext 

    CGContextMoveToPoint(context, lastPoint.x, lastPoint.y) 

    if !dragged { 
     CGContextAddLineToPoint(context, lastPoint.x, lastPoint.y) 
    } else { 
     CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y) 

     lastPoint = currentPoint 
    } 

    CGContextSetLineCap(context, .Round) 
    CGContextSetLineWidth(context, brushSize) 
    CGContextSetRGBStrokeColor(context, red, green, blue, alpha) 
    CGContextSetBlendMode(context, .Normal) 

    CGContextDrawPath(context, .Stroke) 
    } 

    // Mouse event functions 

    override func mouseDown(event: NSEvent) { 
    dragged = false 

    lastPoint = event.locationInWindow 

    self.setNeedsDisplayInRect(self.frame) 
    } 

    override func mouseDragged(event: NSEvent) { 
    dragged = true 

    currentPoint = event.locationInWindow 

    self.setNeedsDisplayInRect(self.frame) 
    } 

    override func mouseUp(event: NSEvent) { 
    self.setNeedsDisplayInRect(self.frame) 
    } 
} 

答えて

1

は、ここで私は(マウスやスタイラスで)で描いてるNSViewのための私のクラスです。これをプロパティに保存できます。より多くのポイントが入ったらlineToPointに電話して、strokeと呼んでそれを描くことができます。例:

let strokeColor = NSColor(red: red, green: green, blue: blue, alpha: 1.0) 

let path = NSBezierPath() 
path.lineWidth = brushSize 
path.lineCapStyle = .RoundLineCapStyle 
path.lineJoinStyle = .RoundLineJoinStyle 

path.moveToPoint(lastPoint) 
path.lineToPoint(currentPoint) 
... 

strokeColor.setStroke() 
path.stroke() 
1

CGContextCopyPathを探しています。それはあなたにCGPath擬似オブジェクトを渡します。 NSBezierPathがのリアルオブジェクトであり、ARCがそれをメモリ管理するため、NSBezierPathがpathとしてNSBezierPathに保存するのが最も簡単な方法です。

関連する問題