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