2015-03-19 15 views
12

Setup:

Xcode 6.1
OS X 10.9.5
Swift Mac tài liệu dựa trên mục tiêu ứng dụngSwift trên OS X: Làm thế nào để truy cập CGContext hiện để vẽ trong - [NSView drawRect:]

Câu hỏi:

tôi đang sử dụng Swift để thực hiện một ứng dụng Cocoa Mac (KHÔNG iOS!). Tôi có một lớp con tùy chỉnh NSView. Tôi muốn ghi đè -drawRect: và truy cập CGContext hiện tại để thực hiện một số bản vẽ bằng API CoreGraphics.

Tuy nhiên, dường như tôi không thể truy cập vào số CGContext hiện tại trong Swift (điều tôi đã thực hiện hàng trăm lần trong ObjC). Dưới đây là mã của tôi:

import Cocoa 

class Canvas: NSView { 
    override func drawRect(dirtyRect: CGRect) { 
     if let ctx: CGContext! = NSGraphicsContext.currentContext()?.CGContext { 
      // do drawing 
     } 
    } 
} 

Khi tôi chạy, tôi nhận được một tai nạn ngay trên dòng đầu tiên thực hiện drawRect tôi:

-[NSWindowGraphicsContext CGContext]: unrecognized selector sent to instance 0x60800005e840 

Tôi đang làm gì sai? Làm cách nào để tìm nạp CGContext hiện tại để vẽ trong Swift?

LƯU Ý:

Tôi chắc chắn muốn sử dụng API CoreGraphics. Trừ khi sử dụng API CoreGraphics trong Swift là hoàn toàn không thể, vui lòng không trả lời với các đề xuất về cách sử dụng API vẽ AppKit thay thế (tôi không quan tâm nếu chúng dễ dàng hơn). Tôi muốn biết cách sử dụng CoreGraphics từ Swift trên OS X.

+1

OP đây. Ngay lập tức sau khi đăng câu hỏi này tôi nhận ra rằng '- [NSGraphicsContext CGContext]' là một API 10.10. Và như tôi đã nói, tôi đang phát triển trên 10.9 (mặc dù mục tiêu của tôi là sử dụng 10.10 Base SDK). Vì vậy, đó là vấn đề. Câu hỏi này là câm, về cơ bản. Đây thực sự là dòng đầu tiên của mã Swift tôi đã viết, vì vậy tôi vẫn đang dò dẫm xung quanh, và tôi đã giả định rằng tôi đã làm sai điều gì đó về cú pháp. –

Trả lời

8

Thật không may, CGContext chỉ có sẵn trong 10.10+. Ngoài ra còn có graphicsPort, nhưng nó có loại UnsafeMutablePointer<Void> (và có lẽ phải được trao đổi một chút để khôi phục một số khả thi CGContext) và không được chấp thuận trong 10.10.

Nếu điều đó có vẻ không khả thi, bạn có thể tạo ngữ cảnh bitmap bằng cách sử dụng CGBitmapContextCreate và vẽ vào đó; sau đó bạn có thể lấy một hình ảnh từ nó và vẽ nó để xem kết quả.

+1

OK, cảm ơn. Có vẻ tôi thực sự cần phải di chuyển để phát triển trên 10.10 ngay lập tức để làm cho mọi thứ dễ dàng hơn cho bản thân mình. Gonna làm điều đó ngay bây giờ. –

+0

Hãy đến với nó và chúc may mắn — Swift 1.2b3 trong Xcode 6.3b3 là hợp pháp. –

21

Ví dụ

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

Điều này rất thanh lịch! Tuy nhiên, nó chỉ hoạt động trong Swift 2? –

Các vấn đề liên quan