2011-03-04 69 views
2

我有一個CALayer的(imageLayer),以及用作對CALayer的(maskLayer)的掩膜的子類的CALayer。CALayer的setNeedsDisplayInRect - 什麼是InRect點?或更快的圖形中drawInContext

我用手指到maskLayer畫,這樣我可以暫時清除出imageLayer的一部分。

我通過保持一個位圖上下文(maskContext),並在touchesMoved加入輕撫它實現這一點。所以我的maskContext只包含了我畫的所有筆畫。在touchesMoved,我做了[maskLayer setNeedsDisplay];

在我的子類maskLayer,我有drawInContext方法:

-(void)drawInContext:(CGContextRef)ctx 
{ 
    CGImageRef image = CGBitmapContextCreateImage(maskContext); 
    CGContextDrawImage(ctx, CGRectMake(0,0,self.frame.size.width, self.frame.size.height), image); 
} 

這一切工作的很好,但速度很慢,因爲它是繪製每個touchesMoved事件的全貌。

我想到使用[maskLayer setNeedsDisplayInRect:rect],但我想知道重點是什麼,因爲drawInContext不看rect。我可以在RECT傳遞給drawInContext,但我能做到這一點,只需setNeedsDisplay

setNeedsDisplayInRect是否有setNeedsDisplay不適用於CALayer?

(我知道,如果我使用drawRect,將接受定義的矩形,而是一個CALayer的的drawInContext沒有)

此外,有沒有用手指繪畫完成這個掩蔽沒有更好的辦法?主要的問題是CGContext上不是一個帆布和不記得以前的筆觸,讓他們有重新繪製所有的時間。

回答

2

如果您通過調用setNeedsDisplayInRect:來標記要顯示的圖層,則可以使用CGContextGetClipBoundingBox來獲取標記爲顯示在drawInContext:中的區域。

+0

有趣的是,謝謝 - 我會重新審視它。 – Caroline 2011-08-03 04:05:53

+0

非常感謝!我一直在試圖讓NSView執行CALayer設計的功能。現在,如果我可以用隱含的動畫清除問題,我就會變成金色的:) – Ash 2013-10-03 18:25:56