190

我想自定义 UITableView 中所有 UITableViewCells 的背景(也可能还有边框)。到目前为止,我还无法自定义这些东西,所以我有一堆默认的白色背景单元格。

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

4

17 回答 17

205

这是我遇到的解决此问题的最有效方法,使用 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]];

这个解决方案在我的情况下效果很好......

于 2009-08-03T07:02:43.847 回答
195

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

于 2008-11-11T18:13:50.870 回答
105

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

这适用于普通样式和分组样式:

代码:

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

PS:这里是 willDisplayCell 的文档摘录:

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

我在colionel 的这篇文章中找到了这些信息。谢谢他!

于 2010-05-10T13:57:15.683 回答
59

到目前为止我发现的最好的方法是设置单元格的背景视图和单元格子视图的清晰背景。当然,这在只有索引样式的桌子上看起来不错,无论是否有配件。

这是一个单元格背景为黄色的示例:

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 ];
}
于 2008-11-14T14:31:09.223 回答
19

只需将其放入 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;
}
于 2010-04-17T10:03:54.503 回答
7

我同意 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;
    }

}
于 2010-12-06T15:01:42.257 回答
6

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

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
于 2013-06-08T09:43:24.427 回答
4

vlado.grigorov 有一些很好的建议 - 最好的方法是创建一个 backgroundView,并给它一个颜色,将其他所有内容设置为 clearColor。另外,我认为这种方式是正确清除颜色的唯一方法(尝试他的示例 - 但设置'clearColor'而不是'yellowColor'),这就是我想要做的。

于 2009-03-04T06:10:13.607 回答
3

自定义表格视图单元格的背景最终成为“全有或全无”的方法。很难以一种看起来不奇怪的方式更改用于内容单元格背景的颜色或图像。

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

如果您更改内容单元格的颜色,您最终会在角落看到白色位。如果您更改整个单元格的颜色,您将有一个跨越视图宽度的颜色块。

您绝对可以自定义一个单元格,但它并不像您最初想象的那么容易。

于 2008-11-11T21:32:17.057 回答
3

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

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
于 2011-09-28T10:32:34.210 回答
3

扩展 N.Berendt 的回答 - 如果您想根据实际单元格数据对象中的某些状态设置单元格颜色,则在您配置表格单元格的其余信息时,通常是在您处于cellForRowAtIndexPath 方法,您可以通过重写 willDisplayCell 方法来从内容视图背景颜色设置单元格背景颜色来做到这一点 - 这解决了披露按钮背景等问题不正确但仍然允许您控制 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 方法中进行。

于 2012-02-02T01:08:11.230 回答
3

使用 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 设置为自定义,这也将起作用。

于 2013-02-25T21:12:15.987 回答
2

我的解决方案是将以下代码添加到 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];

在任何情况下都可以工作,即使使用披露按钮,并且我认为在 cellForRowAtIndexPath 中对单元格颜色状态进行操作的逻辑比在 cellWillShow 事件中更好。

于 2011-02-07T13:56:27.010 回答
1

子类 UITableViewCell 并将其添加到实现中:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
于 2012-12-06T21:32:56.540 回答
1
    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];
于 2013-04-04T08:55:05.163 回答
1

这将适用于最新的 Xcode。

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
于 2017-04-20T07:15:40.913 回答
0

试试这个:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
于 2015-10-19T05:08:52.660 回答