2011-07-28 134 views
8

我想讓用戶用手指畫一個視圖。我在畫筆的Pixelmator中製作了一個PNG。我的drawRect:方法是這樣的:UIImage不透明

- (void)drawRect:(CGRect)rect 
{ 

    NSAssert(brush != nil, @""); 

    for (UITouch *touch in touchesNeedingDrawing) 
    { 
     //Draw the touch 
     [brush drawInRect:CGRectWithPoints([touch locationInView:self], [touch previousLocationInView:self]) blendMode:0 alpha:1]; 
    } 

    [touchesNeedingDrawing removeAllObjects]; 
} 

刷圖像與透明PNG,但是當我運行應用程序,沒有透明度。有誰知道爲什麼,以及如何解決它?

編輯: 我發現該圖像是透明的,但是當我打電話drawInRect,圖像繪製的透明像素作爲視圖的背景顏色。有沒有可以用來解決這個問題的CGBlendMode?

+0

畫筆是一個UIImage,只是爲了澄清。 –

+0

爲什麼你不能使用UIImageView? – pt2ph8

+0

因爲我需要數百個UIImageView子視圖,這是不切實際的。我試圖讓用戶用手指畫一個畫筆圖像,每次他們的手指移動時,我都需要一個新的UIImageView。我也有刪除問題。 –

回答

1

現在看來似乎可以考慮上下文的​​當前填充顏色。

嘗試設置與CGContextSetFillColorWithColor(背景填充顏色)爲[的UIColor clearColor] .CGColor

如果不起作用,唯一的解決方案是簡單的,不應該有一個性能命中有2次:

  • 背景視圖 - 該視圖將檢測觸摸等,然後繪製所有的筆觸的頂部 - 即具有適當的背景顏色或圖像
  • 重疊視圖這將是圖。此視圖的背景顏色可以是[UIColor clearColor],因此當您繪製畫筆圖像時,Alpha將被填充[UIColor clearColor]。基本上你現在擁有同樣的觀點,只是背景清晰。

注意:您不應該混淆混合模式才能使其工作。你應該能夠使用默認的drawInRect:方法

0

畫筆png是否加載到imageView?也就是變量畫筆是UIImageView的一個對象,不是嗎? 如果是這樣,也許簡單

brush.backgroundColor = [UIColor clearColor]; 

將有助於

+0

刷是UIImage –

+1

我建議使它成爲UIImageView。 'UIImageView * brush = [UIImageView imageNamed:@「brush.png」];' – ColdLogic

+0

Btw也許這就是爲什麼我認爲它會是UIImageView的原因。似乎我碰到了與UIImage一樣的問題。 – makaron

0

我認爲你應該嘗試目的地出混合模式:kCGBlendModeDestinationOut

你也可以畫點的矩形,而不是得出:

4

解決方案很簡單,在我自己的項目睾丸。在類使用自定義- (void)drawRect:(CGRect)rect-(id)init背景顏色自行

[self setBackgroundColor:[UIColor clearColor]];

並且那所有更新。測試我的項目。

+0

+1。大。尤其是看到「我相信......」,「看起來像......」和「我應該......」的回答。事實。愛它:-) – vstrien

+0

@moonlight - 我認爲你的意思是在你自己的項目上進行「測試」,而不是在你自己的項目上進行「測試」。 –

0

一個可能的問題是,您正在將blendMode設置爲0.我建議在不使用混合模式的情況下使用-drawInRect:方法。這個問題也可能是你的觀點有黑色背景,但這是令人懷疑的。我還建議嘗試在UIImageView中顯示UIImage作爲測試。這個問題可能與PixelMator輸出圖像的方式有關。

0

你的問題是如何drawRect:實際工作的根本誤解。每次在當前的圖形上下文中繪製一些東西時,以前的所有東西都會被清除(所以只剩下backgroundColor)。

既然你只繪製當前觸摸(ES)(touchesNeedingDrawing被清空),沒有什麼您填寫,可以顯示你正在繪製圖像的透明度的矩形下的,所以背景顏色可以透過。

你基本上有兩種選擇,以解決此問題:

1)保持有助於周圍繪製所有觸摸(不清空touchesNeedingDrawing陣列),每次重繪所有的人 - 這將是容易但很慢。

2)繪製成某種緩衝區(例如UIImage,使用UIGraphicsBeginImageContext等)。每次你的繪圖改變時,創建一個新的緩衝區。將舊緩衝區繪製到新緩衝區中,並將新緩衝區的圖像繪製到新緩衝區上。