Сохраните рисунок Quartz / Core Graphics в coredata или текстовый файл и загрузите его снова, чтобы продолжить рисование - PullRequest
1 голос
/ 28 октября 2011

Это мой первый вопрос здесь. У меня есть приложение для заметок, на котором можно рисовать, менять размер пера, менять цвета и т. Д.

Рисование выполняется в графическом коде ядра в методе viewRect: метод после обнаружения касаний. Теперь я хочу сохранить этот чертеж в Core Data или текстовый файл без разницы и иметь возможность загрузить его снова и продолжить рисование. Могу ли я сохранить его как NSDATA с imagePngRepresentation? Это растровое изображение, и я не могу продолжать рисовать снова.

Пожалуйста, помогите мне, как лучше всего это сделать, сохранить чертеж и затем снова загрузить его, чтобы продолжить рисование?

Большое спасибо !!

1 Ответ

0 голосов
/ 09 декабря 2011

Я знаю, что уже поздно, но я потратил последние несколько часов, чтобы понять это сам. Итак, вот так:

В файлах nib / xib (а теперь и в раскадровках) вы можете «заморозить» свои представления в файле, создав интерфейс в Interface Builder. По сути, здесь он архивирует эти объекты и сохраняет их в файле. Разве не было бы замечательно, если бы пользователи могли делать это с представлениями в вашем приложении? Ну, они могут!

Справочник Apple по архивированию действительно помог. Я читаю это спереди назад.

Для каждого вашего подкласса 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. Например, я использую объекты UIGestureRecognizer в некоторых из моих подклассов UIView. Поскольку они не соответствуют протоколу, я просто воссоздаю их, когда представление разархивировано с 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];
}

Надеюсь, это поможет!

...