2012-03-19 49 views
0

我使用委託方法drawLayer:inContext來更改背景不透明度,因爲它在屏幕上移動時會變爲小框。該圖層在初始化時將UIImage設置爲內容。當使用drawLayer時,UIImage內容消失(並重新出現):inContext

每次drawLayer:調用inContext時,圖像將會消失或重新出現(來回切換),從而在屏幕上製作出一個令人滿意的動作。

我有圖像數據作爲委託類中的本地ivar,因此它不需要每次都重新加載。

我不確定是什麼原因造成的。有任何想法嗎?以下是我正在使用的代碼:

- (id)init 
{ 
    self = [super init]; 
    if(self) { 
     UIImage *layerImage = [UIImage imageNamed:@"Hypno.png"]; 
     image = layerImage.CGImage; 
    } 
    return self; 
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    float alpha = layer.position.y/layer.superlayer.bounds.size.height; 
    UIColor *reddish = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:alpha]; 
    CGColorRef cgReddish = reddish.CGColor; 
    layer.backgroundColor = cgReddish; 
    [layer setContents:(id)image]; 
} 

回答

0

請勿使用-drawLayer:inContext:。該方法用於繪製到CG上下文中,然後使用Core Graphics或UIKit方法將該上下文變爲圖層的內容。您根本不想更改圖層的內容 - 您希望將其設置爲您的圖像,然後再不再觸摸它。

您的圖像正在出現並消失,因爲有時圖層會顯示圖像,而其他時候圖層會顯示您在-drawLayer:inContext:的上下文中繪製的內容 - 即沒有任何圖像。

(另外:。爲了-drawLayer:inContext:被調用,你必須調用[layer setNeedsDisplay],或者你有層的needsDisplayOnBoundsChange開啓,或類似的東西,不要做任何的那個)

相反,嘗試使用CALayer佈局機械。例如,在圖層的委託:

- (void)layoutSublayersOfLayer:(CALayer *)layer 
{ 
    float alpha = layer.position.y/layer.superlayer.bounds.size.height; 
    UIColor *reddish = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:alpha]; 
    CGColorRef cgReddish = reddish.CGColor; 
    layer.backgroundColor = cgReddish; 
} 

這將調用作爲顯示過程的一部分,隨時隨地層或任何其superlayers的已調用其-setNeedsLayout方法。通常這是自動發生的,但根據導致圖層移動的確切原因,您可能需要手動完成。試試看看。

(或者:既然你已經有一些代碼改變層的位置,爲什麼不同時改變層的背景色)

+0

這肯定更有意義。 如果我只想改變內容圖像的不透明度,但保持背景顏色不變,該怎麼辦? (我在此圖層上調用setNeedsDisplay。) – astoffel 2012-03-19 21:20:20

+0

您可能需要兩個圖層,一個繪製背景,另一個繪製圖像。你會改變圖像層的'opacity'屬性。根據您的設置,其中一個圖層可能是另一個圖層的子圖層 - 這可能會更容易以這種方式進行組織。 – 2012-03-19 21:22:19

+0

這正是我所做的。 2層,圖像層作爲另一層的子層,然後改變圖像層的不透明度。現在很好用!謝謝! – astoffel 2012-03-21 17:57:48

相關問題