I am using the code below to learn more about drawing but I am getting an ambiguous error on the line not sure how to resolve this. Please advise how to code this. Thanks
let context = NSGraphicsContext.current()?.cgContext
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
** let context = NSGraphicsContext.current()?.cgContext**
let length = CGPoint(x: 100, y: 100)
let p1 = CGPoint(x: 200, y: 200)
let shape = "square"
context!.beginPath()
context!.move(to: p1)
if shape == "line" {
let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
context!.addLine(to: pointEnd)
} else if shape == "square" {
let p2 = CGPoint(x: p1.x + length.x, y: p1.y)
let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
let p4 = CGPoint(x: p1.x, y: p1.y + length.y)
context!.addLine(to: p2)
context!.addLine(to: p3)
context!.addLine(to: p4)
context!.addLine(to: p1)
}
context!.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0)
context!.setFillColor(red: 0, green: 1, blue: 0, alpha: 1)
context!.setLineWidth(2.0)
context!.strokePath()
let textColor = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1.0)
let textColorB = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 0.0)
let rect = CGRect(x: 200, y: 200, width: 30, height: 130)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let attr = [NSAttributedString.Key.paragraphStyle: paragraphStyle, NSAttributedString.Key.foregroundColor: textColor, NSAttributedString.Key.backgroundColor: textColorB, NSAttributedString.Key.font:NSFont.init(name: "HelveticaNeue-Thin", size: 14)]
let q: NSString = "hello, world"
let center = CGPoint(x: 0, y: 0)
q.draw(at: center, withAttributes: attr as [NSAttributedString.Key : Any])
}
}
In Swift, NSGraphicsContext.current
is a class property, not a function, so you can't have ()
after it:
let context = NSGraphicsContext.current?.cgContext
Also, it's (strictly speaking) correct to store the optional result as context
and to reference it later as context!
, but it's poor Swift coding practice, even if you're sure that it will never be nil. Instead, you could do something like this:
guard let context = NSGraphicsContext.current?.cgContext else {
// handle the error somehow
}
Or, you can avoid having to deal with an error by making the drawing conditional, something like:
if let context = NSGraphicsContext.current?.cgContext {
let length = CGPoint(x: 100, y: 100)
let p1 = CGPoint(x: 200, y: 200)
let shape = "square"
context.beginPath()
context.move(to: p1)
if shape == "line" {
let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
context.addLine(to: pointEnd)
} else if shape == "square" {
let p2 = CGPoint(x: p1.x + length.x, y: p1.y)
let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
let p4 = CGPoint(x: p1.x, y: p1.y + length.y)
context.addLine(to: p2)
context.addLine(to: p3)
context.addLine(to: p4)
context.addLine(to: p1)
}
context.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0)
context.setFillColor(red: 0, green: 1, blue: 0, alpha: 1)
context.setLineWidth(2.0)
context.strokePath()
}
…