如何使用CALayers保存状态?

时间:2009-07-21 18:34:37

标签: cocoa cocoa-touch uikit core-animation calayer

我有一个简单的iphone应用程序,它使用CALayer的子类绘制块,并且我正在尝试找到保存状态或保留当前创建的图层的最佳方法。

我尝试使用Brad Larson's answer from this previous question在NSUserDefaults中存储自定义对象,这些对象用于持久化我的CALayer子类,但不是它的基本状态,如几何和背景颜色,所以它们在那里,但没有重新启动渲染。

我使我声明的实例变量符合NSCoding协议但不知道如何使CALayer的属性做同样的事情而不重新声明它的所有属性。或者这不是最正确/最好的方法吗?

以下是我用于存档图层数组的代码:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:viewController.view.layer.sublayers] forKey:@"savedArray"];

以下是我用于在-viewDidLoad中重新加载图层的代码:

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];

if (dataRepresentingSavedArray != nil) {

    [self restoreStateWithData:dataRepresentingSavedArray];

and -restoreStateWithData:

    NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];

if (savedLayers != nil) {

    for(layer in savedLayers) {

        [self.view.layer addSublayer:layer];

    }

    [spaceView.layer layoutSublayers];      
}

2 个答案:

答案 0 :(得分:5)

准确地说,根据Apple docs,CALayer实际上是模型,而不是MVC模式中的视图。

“CALayer是图层树对象的模型类。它封装了图层的位置,大小和变换,定义了它的坐标系。”

图层后面的视图实际上是图案的视图部分。如果没有后备视图,则无法显示图层。

在我看来,应该是完全合法的数据序列化候选者。看一下CALVer的KVC Extensions。特别注意:

- (BOOL)shouldArchiveValueForKey:(NSString *)key

答案 1 :(得分:3)

Cocoa(和Cocoa Touch)主要基于模型 - 视图 - 控制器组织。 CALayers在视图层中。这导致两个问题:

  1. 您的图层的哪个部分会显示给用户?
  2. 如何使模型的部分持续存在?
  3. 这些问题的答案是您的解决方案。

    如今,对于一个新的应用程序,持久模型的最简单(当然是最可扩展的)路径可能是核心数据。