2015-03-19 2 views
12

установки:

Xcode 6.1
OS X 10.9.5
Swift Mac целевого применения документа на основеSwift на OS X: Как получить доступ к текущему CGContext для втягивания - [NSView DrawRect:]

Вопрос:

Я использую Swift сделать какао Mac приложение (НЕ IOS!). У меня есть собственный подкласс NSView. Я хотел бы переопределить -drawRect: и получить доступ к текущему CGContext, чтобы сделать некоторые чертежи, используя API-интерфейсы CoreGraphics.

Однако я не могу получить доступ к текущему 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?

Примечание:

Я определенно хочу использовать CoreGraphics API. Если использование API CoreGraphics в Swift полностью невозможно, пожалуйста, не отвечайте на предложения о том, как использовать API-интерфейсы API AppKit (мне все равно, проще ли они). Я хочу знать, как использовать CoreGraphics от Swift в OS X.

+1

OP здесь. Сразу после публикации этого вопроса я понял, что '- [NSGraphicsContext CGContext]' является API 10.10. И, как я уже сказал, я развиваюсь на 10.9 (хотя моя цель использует 10.10 Base SDK). Итак, в этом проблема. В основном этот вопрос глупо. Это буквально первая строка кода Swift, которую я написал, поэтому я все еще нащупываю, и я только предположил, что я делаю что-то неправильно синтаксически. –

ответ

8

К сожалению, CGContext доступен только в 10.10+. Там также graphicsPort, но он имеет тип UnsafeMutablePointer<Void> (и, предположительно, должен быть несколько спорить, чтобы восстановить жизнеспособный CGContext), и он устарел в 10.10.

Если это не представляется жизнеспособным, вы можете создать контекст растрового изображения, используя CGBitmapContextCreate и нарисовать его; то вы можете получить изображение из него и нарисовать это, чтобы увидеть результаты.

+1

Gotcha, спасибо. Похоже, мне действительно нужно перейти к разработке на 10.10 сразу, чтобы облегчить для себя. Собираюсь сделать это сейчас. –

+0

Идите к нему, и удача-Swift 1.2b3 в Xcode 6.3b3 законна. –

21

Пример

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. 
     } 
    } 
} 
+0

Это очень элегантный! Однако он работает только в Swift 2? –