2010-10-16 37 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