2009-12-30 46 views
3

我正在使用以下一段代碼爲UITableViewCell創建漸變背景。雖然這對於普通表格單元格完美適用,但漸變只出現在分組表格單元格的左右角落處。就好像應用了漸變,然後將單元繪製在其上。將背景漸變應用於Grouple表格單元格

有人可以建議修改代碼,這將與分組表格單元格很好嗎?或者有沒有完全不同的方式呢?

- (void)drawRect:(CGRect)rect { 
CGContextRef c = UIGraphicsGetCurrentContext(); 

CGGradientRef myGradient; 
CGColorSpaceRef myColorspace; 

size_t num_locations = 2; 
CGFloat locations[2] = {0.0, 1.0}; 
CGFloat components[8] = {0.8f, 0.8f, 0.8f, 1.0f, // Bottom Colour: Red, Green, Blue, Alpha. 
    0.9f, 0.9f, 0.9f, 1.0}; // Top Colour: Red, Green, Blue, Alpha. 

myColorspace = CGColorSpaceCreateDeviceRGB(); 
myGradient = CGGradientCreateWithColorComponents (myColorspace, components, 
                locations, num_locations); 

CGColorSpaceRelease(myColorspace); 

CGPoint startPoint, endPoint; 
startPoint.x = 0.0; 
startPoint.y = self.frame.size.height; 
endPoint.x = 0.0; 
endPoint.y = 0.0; 
CGContextDrawLinearGradient (c, myGradient, startPoint, endPoint, 0); 

const CGFloat topSepColor[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // Cell Seperator Colour - Top 

CGGradientRelease(myGradient); 

CGContextSetStrokeColor(c, topSepColor); 

CGContextMoveToPoint(c, 0.0, 0.0); 
CGContextSetLineWidth(c, 1.0); 
CGContextSetLineCap(c, kCGLineCapRound); 
CGContextAddLineToPoint(c, self.frame.size.width, 0.0); 
CGContextStrokePath(c); 

const CGFloat bottomSepColor[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // Cell Seperator Colour - Bottom 
CGContextSetStrokeColor(c, bottomSepColor); 

CGContextMoveToPoint(c, 0.0, self.frame.size.height); 
CGContextSetLineWidth(c, 1.0); 
CGContextSetLineCap(c, kCGLineCapRound); 
CGContextAddLineToPoint(c, self.frame.size.width, self.frame.size.height); 
CGContextStrokePath(c); 

[[UIColor blackColor] set]; 
} 

感謝您的幫助。

+0

可能是這樣的[link](http://stackoverflow.com/questions/1784827/change-background-color-of-uitableviewcellfor-2-x-onlygot-the-code-working-fi)可以幫助你,找到方法。 – 2009-12-30 10:54:20

回答

6

我不明白爲什麼人們嘗試寫過於複雜的繪圖程序,以使自定義UITableViewCell。將單元格的backgroundViewselectedBackgroundView屬性的值設置爲標準UIImageView,其中包含所有邊框,斜角,漸變,圓角以及圖像中您喜歡的任何其他元素。

對於圓形表格視圖,您可以創建4個圖像;一個用於頂部單元格,另一個用於底部單元格,一個用於中間單元格,另一個用於單個單元格(如果您的表格只有一行)。

馬特·加拉格爾寫了一個很好的文章在可可的愛情,標題爲Easy custom UITableView drawing

+3

爲什麼不,如果有人喜歡用Quartz繪製,沒有錯。 – Pascal 2010-01-04 15:03:09

+1

我從來沒有說過使用Quartz有什麼問題,我說在這種情況下它過於複雜。對於不熟悉Quartz的開發人員來說,複製Apple的圓角單元並添加漸變對於開發人員來說並不重要,這就是爲什麼圖像是更簡單,更實用的解決方案。 – 2010-01-05 06:33:58

+0

這很棒!我想補充一點,你所建議的文章爲iPhone開發增加了一個全新的維度。萬分感謝! – Prasanna 2010-01-10 11:44:27

0

你可以嘗試像水木清華

for(UIView* v in [cell subviews]){ 
    [v setBackgroundColor:[UIColor clearColor]]; 
} 

,但它僅僅是一個建議。

6

對單元格背景使用自定義視圖允許您完全自定義單元格的外觀,但在屏幕方向更改時可能無法正確縮放。另外,如果你需要的是一個漸變背景,在這兩個普通的細胞和分組風格細胞工程,你可能是最好關閉這個...

我有另一種解決方案,這是遠遠更少的代碼,只需要一個漸變圖片。組單元格樣式的圓角仍然由框架繪製,因此我們不需要擔心爲頂部,中部和底部單元格樣式提供自定義圖像,以便使用此方法來滿足圓角。這是它的外觀:

Image showing the table view cells containing the gradient background in grouped style with rounded corners

梯度圖像是單個像素寬和高的單元(其在此實例中44個像素)。

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cellBackground_1x44.png"]]; 

的代碼使用上的UIColor的colorWithPatternImage方法中,由於奧斯2.0可用的。應在0​​中調用此代碼。當細胞重新使用時,不需要重複呼叫,只有當細胞最初被創建時。

爲了配合我使用的是灰色漸變,我認爲有必要設置選擇顏色選定單元格匹配:

cell.selectionStyle = UITableViewCellSelectionStyleGray; 

您可能還希望更改單元格邊框的顏色太深,使用類似的東西:

[self.tableView setSeparatorColor:[UIColor darkGrayColor]]; 

好吧,就是這樣。我希望人們覺得這很有用。我昨天在網上搜索了幾個小時,只找到含有生成梯度和圓角的自定義繪圖代碼的引用,或者我找到了與Matt Coneybeare的「如何使用CORE GRAPHICS在集合UITABLEVIEW中創建自定義漸變背景」的鏈接。帖子。所有的工作都很好,但如果你只是想要簡單的東西,我相信就是這樣。