如何保存与CALayers状态?(How do I save state with CALayers

2019-10-17 01:41发布

我使用的块的CALayer的子类,我试图找到保存状态或持续,当前创建的层最好的方式描绘了一个简单的iPhone应用程序。

我试着用布拉德·拉尔森的答案从这个先前的问题上存储在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];

而在-restoreStateWithData:

    NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];

if (savedLayers != nil) {

    for(layer in savedLayers) {

        [self.view.layer addSublayer:layer];

    }

    [spaceView.layer layoutSublayers];      
}

Answer 1:

可可(和可可触摸)大多是基于模型 - 视图 - 控制器组织。 CALayers是在视图层。 这导致了两个问题:

  1. 哪一部分的模型确实呈现给用户的层?
  2. 你如何使模型的一部分坚持?

对这些问题的答案是你的解决方案。

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



Answer 2:

只是要准确,根据苹果的文档中,CALayer的其实是模型,而不是在MVC模式的看法。

“CALayer的是用于层树对象模型类 ,它封装了位置,尺寸和层,其定义了它的坐标系的变换。”

该层背后的视图实际上就是图案的视图的一部分。 阿层不能没有背衬视图被显示。

在我看来,它应该是对数据序列化一个完全合法的候选人。 看看在KVC扩展了的CALayer。 特别是看看:

- (BOOL)shouldArchiveValueForKey:(NSString *)key


文章来源: How do I save state with CALayers?