2010-07-18 118 views
7

我想創建一個漸變UITableViewCell背景,就像iPhone上默認的Clock應用程序一樣。我不確定如何實現這一點。我是否創建圖片並將其設置爲:如何設置漸變UITableViewCell背景?

cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]]; 

或者是否有其他更好的方法?

+0

我認爲這是唯一的方法 – tadejsv 2010-07-18 17:39:55

+1

如果我的身高不是相同的大小?我如何創建我的背景圖形? – 2010-07-18 18:04:46

回答

13

我發現現有的回答這個問題,但並不滿足。這是一種替代方法,它需要更少的代碼,不需要重寫任何方法,並且可以應用於任何視圖。這個想法是將一個CAGradientLayer作爲子層添加到UIView的層。我無法在任何地方找到這種方法,所以我想分享。

添加CAGradientLayer任何UIView如下:

UIView頭種類 - UIView的+ Gradient.h:

#import <UIKit/UIKit.h> 

@interface UIView (Gradient) 
-(void) addLinearUniformGradient:(NSArray *)stopColors; 
@end 

類別上UIView實施的UIView + Gradient.m:

#import "UIView+Gradient.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation UIView (Gradient) 

-(void) addLinearUniformGradient:(NSArray *)stopColors 
{ 
    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = self.bounds; 
    gradient.colors = stopColors; 
    gradient.startPoint = CGPointMake(0.5f, 0.0f); 
    gradient.endPoint = CGPointMake(0.5f, 1.0f);  
    [self.layer addSublayer:gradient]; 
} 

@end 

如何在創建後在UITableViewCell的backgroundView上設置漸變廷UITableViewCell

// Set the gradient for the cell's background 
CGRect backgroundViewFrame = cell.contentView.frame; 
backgroundViewFrame.size.height = yourCellHeight; 
cell.backgroundView = [[UIView alloc] initWithFrame:backgroundViewFrame]; 
[cell.backgroundView addLinearUniformGradient:[NSArray arrayWithObjects: 
               (id)[[UIColor redColor] CGColor], 
               (id)[[UIColor greenColor] CGColor], nil]]; 

這個例子僅表現如何設置一個簡單的兩止動梯度(具有均勻的間隔)。快速查看CAGradientLayer文檔將向您展示如何設置更復雜的漸變。

*編輯的其他重要信息*

要記住一個額外的事情是,如果你在這樣的tableView的方法添加漸變層:的cellForRowAtIndexPath,在UITableViewCells是一般的存在重用(即[tableView dequeueReusableCellWithIdentifier:@「foo」])。因爲單元格正在被重新使用,所以如果每次單元格出列時總是向表格單元格添加一個漸變圖層,則最終可能會在單元格的整個生命週期中向tableview單元格中添加多個漸變圖層。這可能是性能下降的根源。這個問題可能會在可見結果沒有任何變化的情況下發生,因此可能難以檢測/觀察。有幾種方法可以解決這個問題,但您可能會考慮的一件事是修改上面的原始代碼,除了添加CAGradientLayer以將創建的CAGradientLayer返回給調用者。然後,它是相當簡單的寫另外一類方法,它允許,如果它實際上是包含在視圖中刪除的梯度層:

-(BOOL) removeGradient:(CAGradientLayer *)gradientLayer 
{ 
    // Search for gradient layer and remove it 
    NSArray *layers = [self.layer sublayers]; 
    for (id layer in layers) { 
     if (layer == gradientLayer) { 
      [gradientLayer removeFromSuperlayer]; 
      return YES; 
     } 
    } 

    // Failed to find the gradient layer in this view 
    return NO; 
} 

卸下梯度不需要所有的情況,但如果你的使用情況會導致單元重用,您可能需要考慮刪除漸變。考慮調用這個方法的一個地方是來自UITableViewCell的prepareForReuse方法。

我很抱歉,我原來的解決方案沒有解決這個問題。但由於這件事可能非常微妙,我想用這些附加信息更新我的答案。

+0

我試圖將它應用到分組單元格,但漸變填充是沒有圓角的框。我錯過了什麼? – Claus 2012-05-15 11:49:35

+0

嗯,你可能需要設置圖層半徑/蒙版。閱讀有關以下兩種方法的文檔: [self.layer setCornerRadius:10.0]; [self.layer setMasksToBounds:YES]; 希望你能指出正確的方向。 – Chris 2012-05-16 07:12:51