所以,我有一個自定義的UIView子類,可以繪製圓角邊緣。儘管畫面完美,但背景始終充滿整個邊界,儘管首先剪裁到一條路徑。儘管事實上我在drawRect中繪製了邊框:在背景之前,邊框還在上方繪製了矩形背景。所以我刪除了現在幾乎爲空的drawRect的全部內容:但是背景被繪製了!儘管完全爲空drawRect,UIView子類仍然繪製背景: - 爲什麼?
有人對此有解釋嗎?我在Interface Builder中設置了backgroundColor。謝謝!
所以,我有一個自定義的UIView子類,可以繪製圓角邊緣。儘管畫面完美,但背景始終充滿整個邊界,儘管首先剪裁到一條路徑。儘管事實上我在drawRect中繪製了邊框:在背景之前,邊框還在上方繪製了矩形背景。所以我刪除了現在幾乎爲空的drawRect的全部內容:但是背景被繪製了!儘管完全爲空drawRect,UIView子類仍然繪製背景: - 爲什麼?
有人對此有解釋嗎?我在Interface Builder中設置了backgroundColor。謝謝!
對不起,這個獨白。 :)
事情是,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)分配的顏色。
這是容易複製:
創建一個新的基於視圖的iPhone應用程序。創建一個UIView子類,並將drawRect:方法完全清空。在Interface Builder中,將UIView拖入主視圖中,爲其分配背景顏色並將視圖的類設置爲您的子類。保存,構建並運行,並查看該視圖顯示背景顏色。
我已通過覆蓋setBackgroundColor規避了此行爲:並將顏色分配給我自己的伊娃,始終保留backgroundColor屬性nil。這工作,但我仍然想知道爲什麼這樣工作。
我毫不猶豫地提出這個建議,因爲我不想冒犯你,但你有沒有設置爲不透明的NO?
沒有冒犯,這個問題實際上是一個好問題:是的,不透明被設置爲NO。 :) – Pascal 2010-01-12 11:12:39
有時就是這麼簡單......謝謝! – 2014-04-07 21:47:35
這裏有一個更簡單的解決辦法:
self.backgroundColor = [UIColor clearColor];
是的,這是通過覆蓋setBackgroundColor:來完成的。我更想知道爲什麼會有任何東西被吸引,儘管drawRect:是空的。回答是,背景繪製在drawLayer:inContext :. – Pascal 2010-03-18 23:18:46
您應該設置
clearsContextBeforeDrawing = NO
就這麼簡單。
哎呀。我誤解了這個問題。 OP(原始海報)希望他們的自定義控件支持標準的「backgroundColor」屬性(例如,由gui designer設置),但不希望系統繪製該顏色。 OP想要自己畫bg,以便他能繞過角落。
在這種情況下,關於覆蓋層級圖的帖子是正確的。
我發佈的解決方案將阻止UI系統在繪製之前清除緩衝區。如果沒有定義bg,如果設置了clearsContextBeforeDrawing,則iOS將清除視圖的緩衝區,將所有像素設置爲透明黑色。這樣做的全屏視圖需要5毫秒左右的iPad3,所以它不是免費的(推動2048x1536像素永遠不會)。爲了進行比較,繪製全屏位圖(使用kCGBlendModeCopy強制blitting)需要約25ms(使用石英,而不是GPU)。
這可能是您的繪圖代碼的問題。你可以發佈它,讓我們可以看看?我的猜測是,你正在以某種方式繪製某個地方,要麼忽略alpha值,要麼在你認爲你繪製的東西上繪製了不透明的東西。另外,爲了確保,當你設置'backgroundColor'你有適當的alpha設置? – 2009-10-11 18:14:22
嗯,我可以發佈我的drawRect :,但正如我所說,它是完全空的:
Alpha設置在IB中,並且它可以繪製到我設置的任何顏色,無論使用哪個alpha。 我認爲必須有一些內在的事情,但是沒有新的超級視圖,也沒有可以繪製背景的子視圖。此外,視圖圖層的backgroundColor爲零。 – Pascal 2009-10-11 19:03:52