2009-10-11 30 views
10

所以,我有一個自定義的UIView子類,可以繪製圓角邊緣。儘管畫面完美,但背景始終充滿整個邊界,儘管首先剪裁到一條路徑。儘管事實上我在drawRect中繪製了邊框:在背景之前,邊框還在上方繪製了矩形背景。所以我刪除了現在幾乎爲空的drawRect的全部內容:但是背景被繪製了!儘管完全爲空drawRect,UIView子類仍然繪製背景: - 爲什麼?

有人對此有解釋嗎?我在Interface Builder中設置了backgroundColor。謝謝!

+0

這可能是您的繪圖代碼的問題。你可以發佈它,讓我們可以看看?我的猜測是,你正在以某種方式繪製某個地方,要麼忽略alpha值,要麼在你認爲你繪製的東西上繪製了不透明的東西。另外,爲了確保,當你設置'backgroundColor'你有適當的alpha設置? – 2009-10-11 18:14:22

+0

嗯,我可以發佈我的drawRect :,但正如我所說,它是完全空的:

 - (void) drawRect:(CGRect)rect { } 
Alpha設置在IB中,並且它可以繪製到我設置的任何顏色,無論使用哪個alpha。 我認爲必須有一些內在的事情,但是沒有新的超級視圖,也沒有可以繪製背景的子視圖。此外,視圖圖層的backgroundColor爲零。 – Pascal 2009-10-11 19:03:52

回答

20

對不起,這個獨白。 :)

事情是,UIView的圖層顯然繪製背景,這是獨立於drawRect:。這就是爲什麼你無法通過覆蓋drawRect:擺脫背景。

您可以覆蓋- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx做出任何你想要的圖層繪製,或重寫- (void) setBackgroundColor:(UIColor *)newColor並沒有分配newColor的backgroundColor,而是你自己的伊娃,像myBackgroundColor。然後你可以在drawRect中使用myBackgroundColor;不管你喜歡如何繪製背景。


重寫setBackgroundColor:

定義一個實例變量來保存你的背景顏色,例如myBackgroundColor。在你的init方法,建立真正的背景色是clearColor:

- (id) initWithCoder:(NSCoder *)aDecoder 
{ 
    if ((self = [super init...])) { 
     [super setBackgroundColor:[UIColor clearColor]]; 
    } 
    return self; 
} 

覆蓋:

- (void) setBackgroundColor:(UIColor *)newColor 
{ 
    if (newColor != myBackgroundColor) { 
     [myBackgroundColor release]; 
     myBackgroundColor = [newColor retain]; 
    } 
} 

然後使用myBackgroundColor在您的drawRect:方法。這樣,您可以使用代碼中由Interface Builder(或Xcode4)分配的顏色。

0

這是容易複製:

創建一個新的基於視圖的iPhone應用程序。創建一個UIView子類,並將drawRect:方法完全清空。在Interface Builder中,將UIView拖入主視圖中,爲其分配背景顏色並將視圖的類設置爲您的子類。保存,構建並運行,並查看該視圖顯示背景顏色。

我已通過覆蓋setBackgroundColor規避了此行爲:並將顏色分配給我自己的伊娃,始終保留backgroundColor屬性nil。這工作,但我仍然想知道爲什麼這樣工作。

6

我毫不猶豫地提出這個建議,因爲我不想冒犯你,但你有沒有設置爲不透明的NO?

+1

沒有冒犯,這個問題實際上是一個好問題:是的,不透明被設置爲NO。 :) – Pascal 2010-01-12 11:12:39

+0

有時就是這麼簡單......謝謝! – 2014-04-07 21:47:35

8

這裏有一個更簡單的解決辦法:

self.backgroundColor = [UIColor clearColor]; 
+0

是的,這是通過覆蓋setBackgroundColor:來完成的。我更想知道爲什麼會有任何東西被吸引,儘管drawRect:是空的。回答是,背景繪製在drawLayer:inContext :. – Pascal 2010-03-18 23:18:46

0

您應該設置

clearsContextBeforeDrawing = NO 

就這麼簡單。

UIView Reference Docs

哎呀。我誤解了這個問題。 OP(原始海報)希望他們的自定義控件支持標準的「backgroundColor」屬性(例如,由gui designer設置),但不希望系統繪製該顏色。 OP想要自己畫bg,以便他能繞過角落。

在這種情況下,關於覆蓋層級圖的帖子是正確的。

我發佈的解決方案將阻止UI系統在繪製之前清除緩衝區。如果沒有定義bg,如果設置了clearsContextBeforeDrawing,則iOS將清除視圖的緩衝區,將所有像素設置爲透明黑色。這樣做的全屏視圖需要5毫秒左右的iPad3,所以它不是免費的(推動2048x1536像素永遠不會)。爲了進行比較,繪製全屏位圖(使用kCGBlendModeCopy強制blitting)需要約25ms(使用石英,而不是GPU)。

+0

這並不妨礙backgroundColor被繪製;至少不是我的快速測試。 – Pascal 2012-07-30 04:07:39

+0

如果您未設置backgroundColor,會發生什麼情況? – 2012-07-30 20:32:01

+0

然後,它的作品,這就是爲什麼我選擇重寫'setBackgroundColor:'超級沒有設置顏色,並將背景顏色保存到我自己的伊娃。通過這種方式,在我的自定義'drawRect:'中使用了界面構建器中分配的背景顏色,我不必在代碼中處理這個。 :) – Pascal 2012-07-31 13:58:32

相關問題