将Quartz / Core Graphics绘图保存到核心数据或文本文件并再次加载以保持绘图

时间:2011-10-28 15:24:11

标签: ios core-graphics quartz-graphics

这是我的第一个问题。我有一个可以绘制的记事本应用程序,更改笔的大小,更改颜色等。

在检测到触摸后,绘图在视图的drawRect:方法中的核心图形代码中完成。现在我希望能够将此绘图保存到Core Data或文本文件无关紧要,并且能够再次加载它并继续绘图。我可以使用imagePngRepresentation将其保存为NSDATA吗?那是位图,我不能继续画画了。

请帮助我,最好的方法是什么,保存图纸然后再次加载以便能够继续绘图?

非常感谢!!

1 个答案:

答案 0 :(得分:0)

我知道这已经很晚了,但是我花了几个小时自己搞清楚这一点。所以这里:

在nib / xib文件(现在是故事板)中,您可以通过在Interface Builder中构建界面来“冻结”文件中的视图。从本质上讲,它在这里做的是归档这些对象并将它们存储在一个文件中。如果用户可以在您的应用中对视图执行此操作,这不是很好吗?好吧,他们可以!

Apple archiving的指南确实有帮助。我从前到后阅读。

对于您拥有的每个UIView子类,实现encodeWithCoder:

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [super encodeWithCoder:aCoder];

    // Encode any objects you want to load later. 
    // For example: [aCoder encodeObject:colors forKey:@"colors"];
    // Make sure they conform to the NSCoder protocol!
}

请注意:某些对象不符合NSCoder协议。例如,我在一些UIView子类中使用了UIGestureRecognizer对象。由于它们不符合协议,因此我只是在使用initWithCoder:取消归档视图时重新创建它们。因此,请确保您有一种检索无法存档的对象的方法!

initWithCoder

- (void)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialize your view
        // Restore any objects that you encoded
        // For example: self.colors = [aDecoder decodeObjectForKey:@"colors"];
    }
    return self;
}

要保存视图:

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

- (IBAction)tapSave:(id)sender {
    NSString *directory = [self applicationDocumentsDirectory];
    NSString *archivePath = [directory stringByAppendingPathComponent:@"<filename>.archive"];
    BOOL result = [NSKeyedArchiver archiveRootObject:<your root view> toFile:archivePath];
}

最后,要加载视图及其子视图:

- (IBAction)tapLoad:(id)sender {
    NSString *directory = [self applicationDocumentsDirectory];
    NSString *archivePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"<filename>.archive"];
    unarchivedView = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
}

希望这有帮助!