私は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)
}
}