我一直在尝试用swift在cocoa应用程序中画一条简单的线,但是我不能完全理解如何使用CGContext类。
我创建了这个类:
import Cocoa
class Drawing: NSView {
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
let context = NSGraphicsContext.currentContext()?.CGContext;
CGContextBeginPath(context)
CGContextMoveToPoint(context, 0, 0)
CGContextAddLineToPoint(context, 100, 100)
CGContextSetRGBStrokeColor(context, 1, 1, 1, 1)
CGContextSetLineWidth(context, 5.0)
CGContextStrokePath(context)
}
}
并在主窗口中使用,如下
override func viewDidLoad() {
super.viewDidLoad()
let dr = Drawing()
self.view.addSubview(dr)
dr.drawRect(NSRect(x: 0, y: 0, width: 100, height: 100))
}
但是它什么也没做
你需要用一个框架初始化你的Drawing
视图,否则系统将不知道在哪里绘制它,像这样:
override func viewDidLoad() {
super.viewDidLoad()
let dr = Drawing(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
self.view.addSubview(dr)
}
也如David所说,您不需要自己调用drawRect
,因为它是由系统自动调用的。
我的2美分斯威夫特5。x Xcode 10:
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
guard let context = NSGraphicsContext.current?.cgContext else{
return
}
context.beginPath()
context.move(to: CGPoint.zero)
context.addLine(to: CGPoint( x: 100, y: 100))
context.setStrokeColor(CGColor( red: 1, green: 0, blue: 0, alpha: 1))
context.setLineWidth(5.0)
context.strokePath()
}
您不需要添加视图或使用CoreGraphics指令。简单地这样做:(编辑:我添加了更新示例代码)
class View: NSView {
var p1: NSPoint = .zero {
didSet { needsDisplay = true }
}
var p2: NSPoint = NSPoint(x: 100, y: 100) {
didSet { needsDisplay = true }
}
// Returns the rect using the two points
var rect: NSRect {
NSRect(x: p1.x, y: p1.y,
width: p2.x - p1.x, height: p2.y - p1.y)
}
// Draw a rectangle and its diagonal
override func draw(_ dirtyRect: NSRect) {
// Draw rect
let rect = self.rect
NSColor.red.setFill()
NSColor.black.setStroke()
rect.fill()
rect.stroke()
// Draw line
let path = NSBezierPath()
path.move(to: p1)
path.line(to: p2)
path.stroke()
}
}
不要忘记调用 myView.needsDisplay = true
来更新内容
从那里,检查自动完成,发现Cocoa绘制函数绘制路径,椭圆形,圆角矩形。欢呼:)