2011-06-03 44 views
3

我一直在玩一些Apple's example code用於定製UITableViewCells。我遇到了一些奇怪的行爲,讓我對backgroundColor的工作原理感到困惑。backgroundColor如何在Objective_C中爲UIView處理?

以下代碼是蘋果自定義UITableViewCell中自定義UIView示例的簡化版本。 init函數將背景顏色設置爲紫色,然後drawRect將背景顏色設置爲綠色。我希望永遠不會看到紫色,但這就是我所看到的。通過NSLog語句,我知道爲每個單元調用init方法,然後爲每個單元調用drawRect。綠色環境似乎被忽略。如果我在初始加載後的任何時候撥打[self setNeedsDisplay],背景將被正確設置爲綠色。

- (id)initWithFrame:(CGRect)frame { 
    counter = 0; 
    if ((self = [super initWithFrame:frame])) { 
     self.opaque = YES; 
     self.backgroundColor = [UIColor purpleColor]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    self.backgroundColor = [UIColor greenColor]; 
} 

任何人都可以向我解釋爲什麼會這樣發生?

+0

對不起,但我看到的只是綠色,沒有紫色。你想粘貼你的UITableViewDataSource代碼嗎? – ZhangChn 2011-06-03 17:41:13

+0

如果你看看上面的蘋果鏈接,看看第五個例子,那就是我開始的項目。唯一的改變是將CustomeTableViewCell簡化爲基本上你所看到的,因爲它是我能得到的最小代碼量,仍然顯示我看到的問題。 – JGoforth 2011-06-04 04:19:52

回答

0

-drawRect:實施實際上並沒有做任何繪圖,所以它不會改變任何東西本身。

可能是由與您的視圖關聯的圖層完成繪圖。在您的環境中,看起來像背景色的圖層在調用方法之前正在執行其繪製。當圖層重新繪製時,您的-drawRect:方法也恰好被調用。因此,在更改背景顏色後,直到背景圖層再次繪製時纔會看到任何更改,因爲您的-drawRect:被再次調用,所以您可以看出發生了什麼變化。

如果您希望立即應用顏色更改,則需要將視圖標記爲需要顯示,以便使用更改後的背景顏色完全重繪。

+0

我上面的例子是一個大大簡化的版本。在原始版本中,-drawRect設置了許多標籤中的文本,並且工作得很好。這只是背景,似乎沒有工作。 – JGoforth 2011-06-04 04:23:06

+0

我對你所說的沒有真正做任何繪畫感興趣。我認爲這是它的重點。 -drawRect與Windows OnPaint()調用不很相似嗎? backgroundColor的特殊之處在於它並不總是被渲染,甚至認爲它已被設置? 對不起,如果這應該是顯而易見的。經過10年的Win開發之後,我現在正在試圖圍繞Objective-C的行爲方式進行研究。 – JGoforth 2011-06-04 04:32:51

+0

@JGoForth在這種情況下,「你的」就是你提供的'-drawRect:'的具體例子。一般來說,'-drawRect:'會做一些繪圖。 'backgroundColor'通常從*外部*繪圖函數,'-init','-viewDidLoad'或動作方法(例如,在某個視圖中觸摸)設置。背景顏色由框架呈現,但與「-drawRect:」完全相關的位置未指定。 – 2011-06-04 12:22:16

0

你可以發佈cellForRowAtIndexPath的代碼?

你爲什麼不嘗試使用

cell.textLabel.textColor = [UIColor purpleColor];