如何使用CALayers保存状态?

Joe*_*ppo 1 cocoa cocoa-touch core-animation calayer uikit

我有一个简单的iphone应用程序,使用CALayer的子类绘制块,并试图找到保存状态或持久保存当前创建的图层的最佳方法.

我尝试使用Brad Larson之前关于在NSUserDefaults中存储自定义对象的问题的答案,这些对象用于持久化我的CALayer子类,但不是它的基本状态,如几何和背景颜色,所以它们在那里,但没有重新启动渲染.

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

这是我用来存档图层数组的代码:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:viewController.view.layer.sublayers] forKey:@"savedArray"];
Run Code Online (Sandbox Code Playgroud)

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

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

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

if (dataRepresentingSavedArray != nil) {

    [self restoreStateWithData:dataRepresentingSavedArray];
Run Code Online (Sandbox Code Playgroud)

并且in -restoreStateWithData:

    NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];

if (savedLayers != nil) {

    for(layer in savedLayers) {

        [self.view.layer addSublayer:layer];

    }

    [spaceView.layer layoutSublayers];      
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ong 5

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

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

图层后面的视图实际上是图案的视图部分.没有支持视图时无法显示图层.

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

- (BOOL)shouldArchiveValueForKey:(NSString *)key
Run Code Online (Sandbox Code Playgroud)