iOS UITableView:更改表格的背景颜色会覆盖单元格的背景颜色

Posted

技术标签:

【中文标题】iOS UITableView:更改表格的背景颜色会覆盖单元格的背景颜色【英文标题】:iOS UITableView: changing background color of table overrides background color of cells 【发布时间】:2013-03-29 22:33:51 【问题描述】:

我有一个问题,我的 tableView 的背景颜色会覆盖我为单个单元格设置的背景颜色。更具体地说,我有一个包含 3 行的表格:顶部单元格为深灰色,底部 2 个单元格为红色:

http://imgur.com/otYlFMx,LvoLDzY,tXiJenw#0

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

    UIColor *sectionBackgroundColor = [UIColor colorWithRed:0.09f green:0.09f blue:0.09f alpha:1.0];
    UIColor *menuItemBackgroundColor = [UIColor redColor];

    if (indexPath.row == 0) 
        cell.backgroundColor = sectionBackgroundColor;
        cell.textLabel.textColor = [UIColor whiteColor];
        cell.textLabel.text = @"MENU";
        cell.textLabel.font= [UIFont systemFontOfSize:16.0];
        cell.selectionStyle = false;
     else if (indexPath.row == 1) 
        cell.backgroundColor = menuItemBackgroundColor;
        cell.textLabel.textColor = [UIColor whiteColor];
        cell.textLabel.text = @"Schedule";
        cell.textLabel.font= [UIFont systemFontOfSize:18.0];
        cell.imageView.image = [UIImage imageNamed:@"Schedule.png"];
     else if (indexPath.row == 2) 
        cell.backgroundColor = menuItemBackgroundColor;
        cell.textLabel.textColor = [UIColor whiteColor];
        cell.textLabel.text = @"Contacts";
        cell.textLabel.font= [UIFont systemFontOfSize:18.0];
        cell.imageView.image = [UIImage imageNamed:@"Contacts.png"];
     else 
        cell.backgroundColor = [UIColor blackColor];
        cell.selectionStyle = false;
    


我正在尝试将底部所有那些空的、未使用的白色单元格设为黑色。根据我的研究,设置 tableView 背景颜色就可以做到这一点:

http://imgur.com/otYlFMx,LvoLDzY,tXiJenw#1

tableView.backgroundColor = [UIColor blackColor];

但是,正如您所注意到的,这行代码也将顶部两个单元格的背景颜色更改为黑色。我对此进行了更多尝试,并注意到了一种通用模式,即除了最后一个之外,每个单元格背景颜色都将更改为黑色:

(见上面链接中的第三张图片)

关于这里发生的事情有什么想法吗?帮助将不胜感激!



我已经尝试过的一些方法不起作用(我会提供更多链接,但我目前的代表不允许我这样做):

A) 使单元格中的视图不透明。更改单元格中不同视图的颜色。

cell.opaque = YES;
cell.backgroundView.opaque = YES;
cell.contentView.opaque = YES;
cell.backgroundColor = menuItemBackgroundColor;
cell.contentView.backgroundColor = menuItemBackgroundColor;
cell.backgroundView.backgroundColor = menuItemBackgroundColor;

B) 设置tableView的backgroundView为nil。

tableView.backgroundView = nil;

C) 设置tableView的backgroundView的背景颜色。

tableView.backgroundView.backgroundColor = [UIColor blackColor];

【问题讨论】:

backgroundView默认为nil,所以cell.backgroundView.backgroundColor = menuItemBackgroundColor;除非您添加了背景视图,否则不会执行任何操作。 【参考方案1】:

设置我的 tableView 的背景颜色会覆盖我为单个单元格设置的背景颜色

没错。烦人,不是吗? :) 问题实际上只是给单元格一个彩色的backgroundView(比听起来容易得多),或者等到tableView:willDisplayCell:forRowAtIndexPath:,然后将单元格的backgroundColor 设置在那里。

【讨论】:

是的,这很烦人!不幸的是,正如我的帖子中所指出的,我已经尝试了这两种方法,但它们都不起作用:( @Chun,你看到我的评论了吗?你添加了 backgroundView 吗? 啊,我现在明白了。是的,这行得通——谢谢!我还找到了另一个解决方案,很快就会发布。 @Chun,真的有用吗?因为我试过了,但没有,但是让表格视图的背景颜色清晰。 实际上没有。我不小心将这两种解决方案结合在一起,这就是我认为它有效的原因。我尝试的是:cell.backgroundView = [[UIView alloc] initWithFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; cell.backgroundView.backgroundColor = menuItemBackgroundColor; 这不起作用。【参考方案2】:

以下解决方法允许您使用情节提要中指定的背景颜色,并避免在代码中设置显式颜色:

dequeueReusableCellWithIdentifier:中,虽然故事板的背景颜色仍然完好无损,但保存它,例如在您的自定义 UITableView 子类的属性中。 稍后,在willDisplayCell: 中,使用您在dequeueReusableCellWithIdentifier: 中保存的值恢复backgroundColor

【讨论】:

以上是关于iOS UITableView:更改表格的背景颜色会覆盖单元格的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中点击时如何更改UITableView Header背景颜色

更改 uitableview 单元格删除按钮背景颜色

分组 UITableView 自定义绘制单元格,而不更改背景颜色?

iOS 8 UITableView 背景颜色外观

UITableView 背景颜色 Swift

iOS Swift - 如何更改表格视图的背景颜色?