2013-04-02 88 views
2

目前我正在使用NSView上的Bézier路徑繪製一些形狀。繪圖代碼在drawRect:方法上執行並在最後創建圖像的位置。使用可可繪製NSImage

我不想在任何地方向用戶顯示此視圖。然而,正如我所知,當我們將視圖添加到超級視圖,然後在NSView上調用display或displayNeedsUpdate方法時,drawRect:方法只會被調用。

我的要求是創建一個我需要的圖形。

而不是繪製到NSView並將其轉換爲PNG,有沒有什麼辦法可以直接繪製圖像?

回答

2

您必須創建一個NSBitmapImageRep並使用bitmapImageRepForCachingDisplayInRect:通過指定您的視圖框架。

將繪製位圖圖像表示。

然後,您只需要使用representationUsingType:NSPNGFileType properties:nil並將結果寫入文件。

樣本下面是從可可中提取與愛的教程:Advanced drawing using AppKit

NSRect iconViewFrame = iconView.frame; 
[iconView setFrame:[iconView nativeRect]]; 

NSBitmapImageRep *bitmapImageRep = 
    [iconView bitmapImageRepForCachingDisplayInRect:[iconView frame]]; 
[iconView 
    cacheDisplayInRect:[iconView bounds] 
    toBitmapImageRep:bitmapImageRep]; 
[[bitmapImageRep representationUsingType:NSPNGFileType properties:nil] 
    writeToURL:[savePanel URL] 
    atomically:YES]; 

[iconView setFrame:iconViewFrame]; 

他們還建議:

創建自己的NSBitmapImageRep,設置獲取到NSGraphicsContext 使用graphicsContextWithBitmapImageRep :,鎖定焦點你自己和 調用drawRect:直接會避免這些問題,並且更靈活。但它會更多的工作,所以我不打擾這個 示例項目(我主要把這個導出代碼放入應用程序,所以我可以 創建應用程序的圖標)。

因此,您可以選擇最適合您需求的解決方案。

+0

糾正我,如果我錯了,這段代碼會將NSView轉換爲PNG,不是嗎?要創建繪圖,-drawRect方法仍然應該執行,不是嗎? – user523791

+1

這是標準的方式。但視圖**不需要以這種方式顯示**。您只需創建視圖而不顯示它。通常人們在需要打印其視圖的特定部分時也是如此。 – Jean

+0

非常感謝您的快速回復 – user523791