2010-10-16 36 views
1

我有Cocoa中包含Quartz-2D引用(描述顏色,填充圖案,漸變和陰影)的對象。我想在我的對象中實現NSCoding協議,因此需要序列化那些不透明的Quartz-2D結構。複製和序列化Quartz引用的最佳實踐

可能的解決方案可能是:

  • 在我的對象,允許設置數據結構從頭開始,只要在需要的時候定義一組屬性。那些可以輕鬆地序列化。 示例:存儲紅色,綠色,藍色和alpha的四個浮標,然後使用CGColorCreate缺點:重複信息,從而潛在的一致性和(至今很小的)空間消耗問題。我需要手動編寫屬性設置器,以便在組件更改時重新創建Quartz結構。這會使我的代碼大幅膨脹。

  • 使用Quartz函數讀出屬性。 示例:對於顏色使用CGColorGetComponents缺點:它似乎適用於顏色。但是對於其他結構沒有相同的功能,所以我不瞭解它如何適用於漸變,陰影,陰影等。

  • 直接從原始不透明結構讀出屬性。 缺點:正如文件所述,結構應該是不透明的。所以萬一有什麼變化的話,我的代碼就會崩潰。 (如果應該這樣做,Apple肯定不會提供像CGColorGetComponents這樣的功能。)此外,諸如CGShadingRef內部的CGFunctionRef之類的東西實際上是在尋求麻煩。

序列化石英結構的最佳實踐是什麼?

回答

4

答案几乎變化從一個班到下一個:

  • CGImage:使用CGImageDestination,使這一個TIFF文件。 (相當於NSImage的TIFFRepresentation方法。)
  • CGPath:編寫一個可用於描述路徑元素的應用程序函數,例如PostScript代碼。寫一個簡單的解釋器去另一個方向。
  • CGColorSpace:您可以導出ICC表示法。
  • CGColor:正如您所描述的,但不要忘記包含色彩空間。
  • CGLayer: Convoluted:創建一個位圖上下文,繪製圖層,並轉儲上下文的圖像,然後序列化。
  • CGFont:該名稱應該足以滿足大多數應用的需求。如果你真的很喜歡(即使用變體功能),你會想要包含字體的變體字典。您必須分別保留字體大小的知識,因爲CGFont沒有一個,並且CGContext不會讓您獲取您在其中設置的一個。
  • CGPDFDocument:從簡單的看,它看起來像CGPDFObjects都是不可變的,所以你只需要存檔原始的PDF數據或你從它得到的URL。
  • CGGradient,CGPattern,CGShading和大多數其他類:是的,你搞砸了。您只需要分別維護您創建對象的所有信息。
+0

謝謝,這確實非常詳細和有用。不幸的是,似乎沒有辦法避免爲我感興趣的對象重複編碼信息。如果你沒有提醒我,我會忘記CGColor的顏色空間,特別感謝你這個! – user8472 2010-10-16 22:30:04