2012-05-23 48 views
2

我正在使用CALayer的自定義擴展功能繪製可滾動圖形,並在[ MyCustomCALayer drawInContext]中調用了CGContextAddCurveToPoint個調用。[CALayer drawInContext]中的重影

我實際上並沒有繪製整個圖形的長度,而是每次更新UIPanGestureRecognizer以反映新的水平偏移量時,我都會重繪圖層的內容。這樣,我只繪製圖形的可見部分,而圖層的邊界只擴展到屏幕的大小。

[ MyCustomCALayer setNeedsDisplay ]當圖形數據改變或平移偏移改變時被調用,然後調用[ MyCustomCALayer drawInContext]

但是,每當在平移過程中重繪圖層時,我都會發生這種奇怪的重影現象。有點四處搜索表明它可能是通過重繪圖層內容調用的implicit animation,但我找不到明確的答案。

這裏的圖形的樣子在休息: At rest

這裏,它是平移期間,與鬼影重繪: ​​

當然,當我繪製整個圖表和調整該層的position屬性可以平移它不是重影,但是在內存中有一個很大的長位圖看起來像是一件壞事。

有沒有人見過這種鬼影?如果(如我所懷疑的)隱式動畫,我該如何禁用所述動畫?

回答

7

它可能是一個隱式動畫。重繪(內容中的更改)與Core Animation中的其他所有內容一樣具有動畫效果。

有許多的方法來防止這種情況,如果你繼承的CALayer做繪圖最好是重寫 - [CALayer的actionForKey:],在變更內容返回nil:

- (id<CAAction>)actionForKey:(NSString *)key 
{ 
    if ([key isEqualToString: @"contents"]) 
    { 
     return nil; 
    } 

    return [super actionForKey: key]; 
} 
+0

輝煌內完成您的修改,感謝@joerick,很好的答案,很好的伎倆。 –

+0

有一點需要注意:actionForKey:也可以用來爲CALayer子類的自定義屬性啓用隱式動畫。有趣的東西!感謝您的答案,正是我所期待的。 – Form

2

禁止隱式動畫的另一種方法是:

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 

如果禁用隱式動畫不這樣做,那麼你可以考慮使用一個滾動視圖,並在隨後渦管的內容大圖繪製整個事情視圖。

編輯:

我忘了提,這方法需要你CATransaction塊

相關問題