I have the following code in swift which doesn't compile:
class CustomView: NSView {
override func drawRect(dirtyRect: NSRect) {
var contextPointer: COpaquePointer = NSGraphicsContext.currentContext()!.graphicsPort()
var context: CGContext? = contextPointer as? CGContext
CGContextSetRGBFillColor(context, 1, 0, 0, 1)
CGContextFillRect(context, CGRectMake(0, 0, 100, 100))
CGContextFlush(context)
}
}
How do I convert COpaquePointer to CGContext?
As of Developer Preview 5, NSGraphicsContext
now has a CGContext
property. It's not documented yet but it's in the header file:
@property (readonly) CGContextRef CGContext NS_RETURNS_INNER_POINTER NS_AVAILABLE_MAC(10_10);
This is kind of ugly; it would be better if the graphicsPort() method was updated to return a CGContextRef directly (like UIGraphicsGetCurrentContext()
), rather than a void*. I added this extension to NSGraphicsContext
to sweep it under the rug for now:
extension NSGraphicsContext {
var cgcontext: CGContext {
return Unmanaged<CGContext>.fromOpaque(self.graphicsPort()).takeUnretainedValue()
}
}
Just call NSGraphicsContext.currentContext().cgcontext
anywhere you need a CGContext.
This seems to be compiling:
var contextPointer = NSGraphicsContext.currentContext()!.graphicsPort()
let context = UnsafePointer<CGContext>(contextPointer).memory
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With