Swift в OS X: как получить доступ к текущему CGContext для рисования -[NSView drawRect:]
настройка:
Xcode 6.1
OS X 10.9.5
Swift Mac цель приложения на основе документов
вопрос:
я использую Свифт чтобы сделать какао Mac app (не iOS!). У меня есть обычай NSView подкласс. Я хотел бы переопределить -drawRect:, и получить доступ к текущему CGContext для рисования с помощью CoreGraphics APIs.
тем не менее, я не могу получить доступ к ток CGContext в Swift (что-то, что я делал сотни раз в ObjC). Вот мой код:
import Cocoa
class Canvas: NSView {
override func drawRect(dirtyRect: CGRect) {
if let ctx: CGContext! = NSGraphicsContext.currentContext()?.CGContext {
// do drawing
}
}
}
когда я бегу, я получаю немедленный сбой на первой строке моего drawRect реализация:
-[NSWindowGraphicsContext CGContext]: unrecognized selector sent to instance 0x60800005e840
что я делаю не так? Как мне получить ток CGContext для рисования в Swift?
Примечание:
Я определенно хочу использовать API CoreGraphics. Если использование API CoreGraphics в Swift полностью невозможно, пожалуйста, не отвечайте предложения о том, как использовать API рисования AppKit вместо этого (мне все равно, если они проще). Я хочу знать, как использовать CoreGraphics от Swift на OS X.
2 ответов
к сожалению, CGContext доступно только в 10.10+. Есть также graphicsPort, но он имеет тип UnsafeMutablePointer<Void> (и, по-видимому, необходимо несколько поспорить, чтобы восстановить жизнеспособный CGContext), и он устарел в 10.10.
если это не кажется жизнеспособным, вы можете создать контекст растрового изображения с помощью CGBitmapContextCreate и нарисуйте это; затем вы можете получить изображение из него и нарисовать это, чтобы увидеть результаты.
пример
class CustomView: NSView {
private var currentContext : CGContext? {
get {
if #available(OSX 10.10, *) {
return NSGraphicsContext.currentContext()?.CGContext
} else if let contextPointer = NSGraphicsContext.currentContext()?.graphicsPort {
let context: CGContextRef = Unmanaged.fromOpaque(COpaquePointer(contextPointer)).takeUnretainedValue()
return context
}
return nil
}
}
private func saveGState(drawStuff: (ctx:CGContextRef) -> ()) -> () {
if let context = self.currentContext {
CGContextSaveGState (context)
drawStuff(ctx: context)
CGContextRestoreGState (context)
}
}
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
saveGState { ctx in
// Drawing code here.
}
}
}