这是我的第一个问题。我有一个可以绘制的记事本应用程序,更改笔的大小,更改颜色等。
在检测到触摸后,绘图在视图的drawRect:方法中的核心图形代码中完成。现在我希望能够将此绘图保存到Core Data或文本文件无关紧要,并且能够再次加载它并继续绘图。我可以使用imagePngRepresentation将其保存为NSDATA吗?那是位图,我不能继续画画了。
请帮助我,最好的方法是什么,保存图纸然后再次加载以便能够继续绘图?
非常感谢!!
答案 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];
}
希望这有帮助!