如何自定义UITableViewCell的背景颜色?

我想定制我的UITableView中的所有UITableViewCell的背景(也可能是边框)。 到目前为止,我还没有能够自定义这个东西,所以我有一堆白色的背景单元,这是默认的。

有没有办法与iPhone SDK做到这一点?

您需要将单元格的contentView的backgroundColor设置为您的颜色。 如果使用附件(例如公开箭头等),它们将显示为白色,因此您可能需要滚动自定义版本。

这里是我遇到的最有效的方法来解决这个问题,使用willDisplayCell委托方法(这将处理文本标签背景的白色,以及使用cell.textLabel.text和/或cell.detailTextLabel.text ):

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... } 

当这个委托方法被调用时,单元格的颜色是通过单元格而不是表格视图来控制的,因为当你使用:

 - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... } 

因此,在单元格委托方法的主体中,添加以下代码来交替单元格的颜色,或者只使用函数调用来使表格的所有单元格具有相同的颜色。

 if (indexPath.row % 2) { [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]]; } else [cell setBackgroundColor:[UIColor clearColor]]; 

这个解决scheme在我的情况下效果很好

这很简单,因为OS 3.0只是在willDisplayCell方法中设置单元格的背景颜色。 您不能在cellForRowAtIndexPath中设置颜色。

这适用于普通和分组风格:

码:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor = [UIColor redColor]; } 

PS:这里的文档提取willDisplayCell:

“表视图在它使用单元格绘制一行之前将其消息发送给它的委托,从而允许委托在显示之前自定义单元对象。此方法使委托有机会覆盖以前由基于状态的属性表格视图,例如select和背景颜色,委托返回之后,表格视图只设置alpha和frame属性,然后只有在滑动或者滑出行的时候animation行。

我在colionel的这篇文章中发现了这个信息。 谢谢他!

到目前为止,我发现的最好的方法是设置单元格的背景视图并清除单元格子视图的背景。 当然,这只适合索引风格的桌子,不pipe有没有配件。

下面是一个示例,其中单元格的背景为黄色:

 UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ]; backgroundView.backgroundColor = [ UIColor yellowColor ]; cell.backgroundView = backgroundView; for ( UIView* view in cell.contentView.subviews ) { view.backgroundColor = [ UIColor clearColor ]; } 

简单地把它放在你的UITableView委托类文件(.m)中:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor]; cell.backgroundColor = color; } 

我同意Seba,我试图在rowForIndexPath委托方法中设置交替行的颜色,但得到3.2和4.2之间不一致的结果。 以下工作对我很好。

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ((indexPath.row % 2) == 1) { cell.backgroundColor = UIColorFromRGB(0xEDEDED); cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED); cell.selectionStyle = UITableViewCellSelectionStyleGray; } else { cell.backgroundColor = [UIColor whiteColor]; cell.selectionStyle = UITableViewCellSelectionStyleGray; } } 

在尝试了所有不同的解决scheme后,下面的方法是最优雅的方法。 更改以下委托方法中的颜色:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (...){ cell.backgroundColor = [UIColor blueColor]; } else { cell.backgroundColor = [UIColor whiteColor]; } } 

vlado.grigorov有一些很好的build议 – 最好的方法是创build一个backgroundView,并给它一个颜色,设置其他所有的clearColor。 此外,我认为这是正确清除颜色的唯一方法(尝试他的示例 – 但设置“clearColor”而不是“yellowColor”),这正是我想要做的。

自定义表格视图单元格的背景最终将成为“全部或全部”的方法。 以一种看起来不奇怪的方式改变用于内容单元背景的颜色或图像是非常困难的。

原因是单元格实际上跨越了视图的宽度。 圆angular只是其绘图风格的一部分,内容视图位于此区域。

如果更改内容单元格的颜色,则最终会在angular落处显示白色的点。 如果更改整个单元格的颜色,则会有一个跨越视图宽度的颜色块。

你绝对可以定制一个单元格,但起初并不像你想象的那么容易。

创build一个视图,并将其设置为单元格的背景视图

 UIView *lab = [[UIView alloc] initWithFrame:cell.frame]; [lab setBackgroundColor:[UIColor grayColor]]; cell.backgroundView = lab; [lab release]; 

创build一个图像使用Photoshop或GIMP的背景,并将其命名为myimage然后将此方法添加到您的tableViewController类

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with gradient color created with gimp UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage]; cellView.contentMode = UIContentViewModeScaleToFill; cell.backgroundView = cellView; //set the background label to clear cell.titleLabel.backgroundColor= [UIColor clearColor]; } 

这也将工作,如果你已经设置UITableView自定义属性检查器

我的解决scheme是将以下代码添加到cellForRowAtIndexPath事件:

 UIView *solidColor = [cell viewWithTag:100]; if (!solidColor) { solidColor = [[UIView alloc] initWithFrame:cell.bounds]; solidColor.tag = 100; //Big tag to access the view afterwards [cell addSubview:solidColor]; [cell sendSubviewToBack:solidColor]; [solidColor release]; } solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0 green:233.0/255.0 blue:233.0/255.0 alpha:1.0]; 

在任何情况下甚至与披露button工作,并更好的逻辑来处理CellForRowAtIndexPath中的单元格颜色状态比cellWillShow事件我认为。

在N.Berendt的答案上扩展 – 如果要根据实际单元格数据对象中的某些状态设置单元格颜色,那么在configuration表单元格的其余信息时(通常是在处于cellForRowAtIndexPath方法,你可以通过覆盖willDisplayCell方法来设置内容视图背景颜色的单元格背景颜色来做到这一点 – 这解决了披露button背景等问题,但仍然可以控制cellForRowAtIndexPath方法中的颜色你正在做你所有的其他细胞定制。

所以:如果你添加这个方法到你的表视图委托:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor = cell.contentView.backgroundColor; } 

然后在你的cellForRowAtIndexPath方法中,你可以这样做:

 if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) { cell.contentView.backgroundColor = [UIColor blueColor]; } 

这样可以节省必须在willDisplayCell方法中再次检索数据对象的情况,并且还可以节省两个位置来定制/定制表格单元格 – 所有自定义都可以在cellForRowAtIndexPath方法中进行。

子类UITableViewCell并在实现中添加:

 -(void)layoutSubviews { [super layoutSubviews]; self.backgroundColor = [UIColor blueColor]; } 
  UIView *bg = [[UIView alloc] initWithFrame:cell.frame]; bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; cell.backgroundView = bg; [bg release]; 

这将在最新的XCodes上工作

 -(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { cell.backgroundColor = [UIColor grayColor]; } 

尝试这个:

 - (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [cell setBackgroundColor:[UIColor clearColor]]; tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]]; }