2011-06-02 27 views
1

我有一個手指繪畫視圖,我正在實現撤消/重做。所有繪圖都發生在名爲lineLayer的CGLayer上。iPhone - 將字典中的值從字典推送到CGlayer

只要用戶觸摸屏幕,但在對屏幕進行任何修改之前,我需要快速獲取視圖內容並創建撤消級別。

顯然將視圖保存到磁盤不是一個選項,因爲它需要很長時間。我想象中的解決方案是將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完全沒有被該讀取操作改變。 它繼續具有與以前相同的內容。

我錯過了什麼嗎?

謝謝。

+0

HI橡皮鴨,你成功的方法嗎? – Ranjit 2012-07-12 10:56:55

回答

0

您是否考慮過用於管理對象的核心數據?我在問,因爲撤銷/重做是免費的嗎?

+0

問題將是相同的。如果我無法從字典中檢索CGLayer,我不會從核心數據中獲取。我已經撤消了(重做其他工作,但不適用於這個CGlayer。顯然這是在字典上保存,但不能檢索。 – SpaceDog 2011-06-02 18:50:06

+0

你是對的,我誤解了問題。我想不出解決方案,但有兩個選擇來一個是爲每個用戶動作創建一個新的CAlayer,當超過撤銷閾值(假設有10個步驟),將閾值降低到閾值以下並將它們合併爲一個;另一個解決方案可能使用核心數據以形式存儲動作並且將drawRect中的所有操作渲染到單層上這可能是可行的,但我不確定性能 – TheBlack 2011-06-02 19:00:14

+0

@Digital Robot另一種方法是對CALayer進行子類化並使用CGContextSaveGState/CGContextRestoreGState CGContext函數。 – TheBlack 2011-06-03 03:04:07

0

您是否嘗試過進行深層複製,如從圖層創建位圖上下文?

+0

你可以發表一些我如何做的例子嗎? – SpaceDog 2011-06-02 18:09:20

+0

like [this](http://losingfight.com/blog/index.php?s=cglayerref&submit=Go) – ZhangChn 2011-06-02 18:30:46

+0

你能更具體嗎?該頁面有一英里的長度和萬億行代碼......謝謝。 – SpaceDog 2011-06-02 18:51:14