iPhone - отправка и извлечение значения из словаря в CGlayer

У меня есть вид рисования пальцем, который я выполняю отменить / повторить. Все рисование происходит на CGLayer, называемом lineLayer.

Как только пользователь касается экрана, но до того, как на экране будут внесены какие-либо изменения, мне нужно быстро захватить содержимое представлений и создать уровень отмены.

Очевидно, что сохранение представления на диск не вариант, потому что это занимает слишком много времени. Решение, которое я придумал, - скопировать CGLayer в словарь, используя что-то вроде этого:

// I copy the layer as a NSValue
NSValue *layerCopy = [NSValue valueWithBytes:&myLayer objCType:@encode(CGLayerRef)];

Я храню это в словаре

NSString *aKey = [NSString stringWithFormat:@"%d", [number intValue]];
[self.dictUNDO setObject:layerCopy forKey:aKey];

позже я извлекаю его, используя

NSString *myKey = [NSString stringWithFormat:@"%d", [number intValue]];
NSValue *myCopy = [self.dictUNDO objectForKey:myKey]; 
[myCopy getValue:&lineLayer];
//lineLayer is the CGLayer where the drawing happens

проблема в том, что lineLayer вообще не изменяется этой операцией чтения. Он по-прежнему имеет то же содержимое, что и раньше.

Я что-то упускаю?

благодаря.


person Duck    schedule 02.06.2011    source источник
comment
Привет, RubberDuck, у вас получился ваш подход?   -  person Ranjit    schedule 12.07.2012


Ответы (2)


Рассматривали ли вы основные данные для управления своими объектами? Я спрашиваю, потому что Undo / redo идет с ним бесплатно?

person TheBlack    schedule 02.06.2011
comment
проблема была бы такая же. Если я не могу получить CGLayer из словаря, я не буду этого делать из основных данных. У меня уже есть Undo (redo работает для других вещей, но не для этого CGlayer. Очевидно, он сохраняет в словаре, но не извлекает. - person Duck; 02.06.2011
comment
Вы правы, я неправильно понял вопрос. Я не могу придумать решение, но на ум приходят две альтернативы. Один из них - создать новый CAlayer для каждого действия пользователя, и при превышении порога отмены (скажем, на 10 шагов назад) захватить эти слои ниже порогового значения и отобразить их в один. Другое решение может заключаться в использовании основных данных для хранения действий в форме состояний и рендеринга всех действий во время drawRect на одном уровне. Возможно, это выполнимо, но я не уверен в производительности. - person TheBlack; 02.06.2011
comment
@Digital Robot Другой вариант - создать подкласс CALayer и использовать функции CGContextSaveGState / CGContextRestoreGState CGContext. - person TheBlack; 03.06.2011

Вы пытались сделать глубокую копию, например, создать контекст растрового изображения из слоя?

person ZhangChn    schedule 02.06.2011
comment
Вы можете опубликовать пример того, как мне это сделать? - person Duck; 02.06.2011
comment
Вы можете быть более конкретным? страница имеет длину в одну милю и триллион строк кода ... спасибо. - person Duck; 02.06.2011
comment
выполните поиск по «глубокой копии», и вы получите ее (единственное совпадение). - person ZhangChn; 02.06.2011